Hi
I'm testing RemoteAdapter with several services. I have tested AcapelaSpeech, Arduino and Servo. I think they are worky now. I have only made very light test yet, so more testing is needed.
The service that I'm testing now is the OpenCV service. It starts up nice and I can see it on both hosts, but as soon as I start capture it fails.
I think that the problem is that java.awt.image.BufferedImage can't be serialized. I found a note in OpenCV.java at line 111
// FIXME - don't return BufferedImage return SerializableImage always !
Have you seen this problem before, or is the comment related to some other problem ?
Any advice on how to fix this issue ?
/Mats
BufferedImage has a long
BufferedImage has a long history with Java - its part of awt ... there are good parts and bad parts to it.
One bad part is - its not serializable, so I created SerializableImage.
The good part of SerializableImage .. is .. well .. its Serializable . the bad part is - it takes time to to convert from a BufferedImage to a byte array with a known image type which can be decoded.
OpenCV at its core is JNI - and within the JNI there are several low level image classes which are used to in many of the OpenCV methods .. IpImage is a commone one
JavaCV does a lot of great work simplifying access to these C & C++ classes .. but they are definately not serializable either.
I have methods in the OpenCV service which will conversion to display in Java land often goes like this :
Frame -> lpImage -> BufferedImage -> SerializableImage ----(serialization)---> ---(network)---> ---(deserialization) ---> SerializableImage --> BufferedImage --> Display in different process / different host
So if your sending an OpenCV service over the wire - there better not be anything which doesnt serialize, or if it is, it needs to be marked as transient
Long term, as far as the process of serialization - its not optimal, we could :
Short term :
look for a member which is of the following type and not transient in OpenCV
Frame, lpImage, BufferedImage
and mark it as transient...
OpenCV RemoteAdapter
I will try the short term solution. It will probably cause that no video wil be shown on the remote host, just on the local, but I think thats fine. Performance would suffer otherwise. Thanks for the advice.
OpenCV and RemoteAdapter
OK.
It's semi working now. OpenCV can execute with RemoteAdapter, but no images passes between the two instances.Need to do more testing to see if results from for example faceDetect and faceRecognizer still will work across multiple instances.
/Mats
MJpeg and the streamer service
Hey Mats,
When you start open cv, it also starts the streamer service. The streamer service takes the video stream and publishes it as a video stream in the MJpeg format.
A while back I added a new frame grabber to OpenCV service. It can attach to a remote MJpeg feed. This is how I was able to get the video stream to a remote instance of OpenCV.
Perhaps , rather than serializing each image/frame, you could just attach to the feed that is produced by the streamer service. (The webgui uses this method to display the video in a browser)
Hope this helps!
Kevin