I got this 3 yr-old code for OpenCV to track a face and send the coordinates to an Arduino. I've confirmed that my Arduino is using com3. But as stated above, I'm getting a Name error telling me that 'serial' is not defined and so won't establish a connection to com3. I'm way too inexperienced with MRL to know how to chase down the serial function, so I'm asking for help.
And fyi, on the serial tab, I get a redline message at the bottom saying there'd been an IO exception, could not open COM3, rate 115200 baud, when I've specified 57600 baud in the code. ANd I can't open the port there, either.
I'm including the code and the output portion of the Java messages that are relevant. Look for the highlighted code:
------------
# create or get a handle to an OpenCV
opencv = Runtime.createAndStart("opencv","OpenCV")
# Convert the video to Black and White
opencv.addFilter("Gray1", "Gray")
# Sometimes gray seems to help# reduce the size - face tracking doesn't need much detail. The smaller the
opencv.addFilter("PyramidDown1", "PyramidDown")
# add the face detect
opencv.addFilter("FaceDetect1", "FaceDetect")
opencv.capture()
#create a Serial service named serial
serialserial = Runtime.createAndStart("serial","Serial")
# This function is called every time the OpenCV service has data available.
# This will depend on the framerate of the video, but will probably be
# somewhere around 15 times a second.
def input():
global x
global y
global sposx
global sposy
global posx
global posy
# Get OpenCV data
opencvData = msg_opencv_publishOpenCVData.data[0]
if (opencvData.getBoundingBoxArray().size() > 0) : # If the box surrounding a face exists
rect = opencvData.getBoundingBoxArray().get(0) # Store the information in rect
posx = rect.x # Get the x position of the corner
posy = rect.y # Get the y position of the corner
w = rect.width # Get the width
h = rect.height # Get the height
sposx = (w/2)
sposy = (h/2)
# Get the x and y of the center in pixels. Origin is in top left corner
x = (posx + sposx)
y = (posy + sposy)
# Convert x,y pixels to (x,y) coordinates from top left.
# Note that 320 and 240 will need to be changed if another pyramid down is used
# It may also need to be changed depending on your cameras specifications.
# This gets the position in a scale from 1, 100
x = int(translate(x, 1, 320, 1, 100)); # translate() works the same way the Arduino map() function would
y = int(translate(y, 1, 140, 1, 100));
print 'x: ' , x # print x to the python readout
print 'y: ' , y # print y to the python readout
#write a series of bytes to the serial port
serial.write(250) # pan code
serial.write(x) # x coordinate
serial.write(251) # tilt code
serial.write(y) # y coordinate
serial.connect("COM3", 57600, 8, 1, 0) <--- this is line 93
#sometimes its important to wait a little for hardware to get ready
sleep(1) # Note that this is 1 full second.
# create a message route from opencv to python so we can see the coordinate locations
opencv.addListener("publishOpenCVData", python.name, "input");
# Start capturing video
opencv.capture() # Add a 1 inside the parenthesis to use camera 1
# Create function to scale values. Mimics Arduino map() function.
def translate(value, leftMin, leftMax, rightMin, rightMax):
# Figure out how 'wide' each range is
leftSpan = leftMax - leftMin
rightSpan = rightMax - rightMin
# Convert the left range into a 0-1 range (float)
valueScaled = float(value - leftMin) / float(leftSpan)
# Convert the 0-1 range into a value in the right range.
return rightMin + (valueScaled * rightSpan)
--------------------------------------
...
[python.interpreter.4] [WARN] no such method Runtime.registered(Serial) : - attempting upcasting
[python.interpreter.4] [WARN] searching through 254 methods
[gui] [WARN] no such method GUIService.registered(Serial) : - attempting upcasting
[python.interpreter.4] [INFO] loading class: org.myrobotlab.serial.PortJSSC
[python] [WARN] no such method Python.onRegistered(Serial) : - attempting upcasting
[gui] [WARN] searching through 192 methods
[python] [WARN] searching through 172 methods
[python] [INFO] exec(String)
from org.myrobotlab.service import Serial
serial = Runtime.getService("serial")
[webgui] [WARN] no such method WebGui.onRegistered(Serial) : - attempting upcasting
[webgui] [WARN] searching through 189 methods
[webgui] [INFO] subscribe [serial/publishStatus ---> webgui/onStatus]
[webgui] [INFO] subscribe [serial/publishState ---> webgui/onState]
[AWT-EventQueue-0] [INFO] subscribe [serial/publishStatus ---> gui/getStatus]
[serial] [INFO] loading class: org.myrobotlab.serial.PortJSSC
[gui] [WARN] no such method SerialGUI.onPortNames(ArrayList) : - attempting upcasting
[gui] [WARN] searching through 53 methods
[python.interpreter.4] [ERROR] python error PyException - null Traceback (most recent call last):
File "<string>", line 93, in <module>
NameError: name 'serial' is not defined
at org.python.core.Py.NameError(Py.java:284)
at org.python.core.PyFrame.getname(PyFrame.java:257) ...
hi in your script the
hi
in your script the variable 'serial' is not defined, that why the error happen
in the beginning of your script, you have
serialserial = Runtime...
so the script generate error because you name your variable 'serialserial' instead of simply 'serial'