PDA

View Full Version : problems with webcam plug-in


v-clizzin
01-24-2008, 04:51 PM
Hi, I am experiencing problems with a Vizard script that makes use of some plug-ins that a previous member of the lab wrote a while ago to connect to a webcam. That person is now out of contact, so I'm hoping to get some help here.

The webcam connection relies on a DLL file called 'capture.dll' which was used to get information from the connected webcam. Right now, we've determined that the script chokes on a line that invokes a Webcam class from the capture module. The relevant code looks like this:

facetrackNet.py
import facetrack
facetracker = facetrack.WebcamTrack()


facetrack.py
import capture
import neven
import math
import threading
import Queue
import chunk
import datetime
import re

class WebcamTrack:
def __init__(self,
width = 320, height = 240, fps = 30, id = 0,
minEyeDist = 20, maxEyeDist = 100, threshhold = 0.4,
fdInit = "V_FD_prec_100.bsk",
ffdInit = "VFFD_22n_101.bsk",
fftInit = "VFFT_22n_103.bsk"):
self.webcam = capture.Webcam(width, height, fps, id,
self._webcamCallback, 0) # CHOKES ON THIS LINE
self.fft = neven.Fft(self.webcam.width(), self.webcam.height(),
minEyeDist, maxEyeDist,
fdInit, ffdInit, fftInit)
self.threshhold = threshhold
self.face = None # Current face. May be None.
self.validFace = GENERIC_FACE # Most recent non-None face.
self.image = "\0" * (self.webcam.width() * self.webcam.height())
self.dataLock = threading.Lock()
self.queue = Queue.Queue(-1)
self.thread = threading.Thread(name = "WebcamTrack" + str(id),
target = _webcamTrackThread,
args = (self,))
self.thread.setDaemon(True)
self.thread.start()
# and so on...


The code chokes on the line "self.webcam = capture.Webcam(width, height, fps, id, self._webcamCallback, 0)". The error I get is:


ERROR in Webcam: Device has no acceptable format
Traceback (most recent call last):
File "facetrackNetBigInsert.py", line 326, in mytimer
facetracker = facetrack.WebcamTrack()
File ".\facetrack.py", line 957, in __init__
self._webcamCallback, 0)
SystemError: NULL result without error in PyObject_Call


As far as I can tell based on the Python sys.path set up on this machine, 'import capture' refers to a 'capture.dll' file. I then presume that this DLL file was compiled based on some C/C++ code in a Visual Studio project. After rooting around a bit, I've found what I think is the C/C++ code that the DLL was compiled from, but the Capture.h and Capture.cpp files I found don't include any sort of class or method named 'Webcam'.

I don't have much experience with DLL's (I barely know what they are or how they work), much less compiling C/C++ projects into DLL's and then linking them to Python, so if someone could provide a link that explains how that works, that would be helpful.

I apologize if all this boils down to 'Please debug some code for me', but at this point I'm rather lost and would appreciate any help I can get. If someone is willing to take a look at the code, I'd be glad to email it to you and would be very appreciative of the help.

One other thing that may be useful: This program was working until just a couple weeks ago. I can think of a couple changes made that might have affected this:

1. I changed the Windows environment path used to look up Python so that I could use Python from the Windows command line. This was formerly "C:\Python", which was a nonexistent directory; I changed it to "C:\Python23" (we are using Python 2.3 because the plug-ins were written for Vizard 2.5, which uses Python 2.3). After the problem with the program started, I tried changing the environment path variable back, but this made no difference.

2. I installed a new device on the machine that required a PCI card which I also added. In doing so, I unplugged everything from the machine to make it easier to open up, and then re-plugged everything in afterwards, including the webcam. I don't know if this would affect the DLL's ability to locate the webcam, but some testing seems to suggest no because a getWebcamNames() method in the capture library still correctly lists the webcam attached to the computer.

Hope someone can help out, thanks very much in advance!

christopher lin

mjabon
01-24-2008, 07:25 PM
I am working with Chris on this problem and I'd like to add that we'd be really appreciative if anyone has documentation on how Vizard works with dlls, etc. We have read the documentation on sensor.h and creating a sensor, but we haven't found anything on general C++ classes, how they need to be created, what paths need to be set, etc so that we can just say simply:

import newmodule.py

when newmodule is actually written in C++

Thanks!

farshizzo
01-25-2008, 04:06 PM
When you call:

import module

Python will search the system path for either module.py or module.dll. You don't have to specify what kind of module it is when you import it.

Either way, from the information you provided, it seems that the module is being imported fine. The problem seems to be that one of its functions is failing. Are you sure that the module does not depend on any 3rd party DLLs that might have gone missing on your system?

Also, to be sure that you are using the correct module, execute the following code immediately after importing the capture module:print capture.__file__This will print the path of the module.