Deklaration von Funktionen mit opencv
-
Hallo liebe Programmierer,
Ich habe Probleme eine Funktion mit opencv richig zu deklarieren. Ich arbeite mit einem Hauptthread und 2 Nebenthreads die von jenem gestartet werden.
Die beiden Nebenthreads sollen ein Bild, dass ich über eine Webcam mit opencv geladen hab abrufen können. Die beiden Nebenthreads laufen gekapselt in eigenen cpp Dateien.
Der Hauptthread und die Funktion aus der die beiden Nebenthreads das Bild laden sollen, ist ebenfalls in eine eigene cpp Datei gepackt und sieht folgender maßen aus.static DWORD WINAPI KvmLaserThread(void* arg) { KvmLaser(); return 0; } static DWORD WINAPI KvmLaser2Thread(void* arg) { KvmLaser2(); return 0; } const CvArr * Video() { CvCapture* capture = cvCaptureFromCAM(-1); printf( "Thread created \n" ); //while(true){ IplImage* img = 0; if(!cvGrabFrame(capture)){ // capture a frame printf("Could not grab a frame\n\7"); exit(0); } img=cvRetrieveFrame(capture); // retrieve the captured frame //Videobild=cvCloneImage(img); cvWaitKey(10); cvcamPause(); cvcamStop(); //} return img; } int main() { CreateThread(0, 0, &KvmLaserThread, NULL, 0, 0); CreateThread(0, 0, &KvmLaser2Thread, NULL, 0, 0); return 0; }Für die Funktion Video() erhalte ich nahezu unendlich viele Fehlermeldungen wegen der Deklaration. WIe deklariere ich sie richtig, damit diese img zurückgibt und wie muss die Deklaration im Header dazu aussehen?
Ich arbeite unter Windows und Microsoft Visual Stuido 2005.
Grüße Theo112
-
Erstmal mußt du vermutlich die Opencv-Header per #include einbinden, um deren Funktionen (cvCaptureFromCAM(), cvGrabFrame() etc) und Datentype (CvArr etc) nutzen zu können.
Zweitens sehe ich keine Deklarationen für die beiden Thread-Funktionen KvmLaser() und KvmLaser2().
Und drittens: Von wo aus wird deine Funktion Video() verwendet?
-
Die ganzen Opencv-Header sind natürlich includet, ich wollte aus platzgründen nur nicht den gesammten Quelltext posten.
Auch die Threads sind deklariert und funktionieren.
Ich habe nur Schiewirigkeiten mit der Funktion. Der Aufruf dieser in einem der Nebenthreads sieht folgendermaßen aus:
int StartUnterprogramm2() { //cvNamedWindow( "Videobild", CV_WINDOW_AUTOSIZE ); int argc=0; char** argv=0; cvSaveImage("Test.bmp",Video()); const char* filename = argc >= 2 ? argv[1] : "Test.bmp"; ...... ...LG Theo112
-
Sorry, wenn ich mich mit opencv nicht so gut auskenne, aber: Was genau erwartet die cvSaveImage() als Parameterwerte?
PS: Und was für einen Sinn hat dein argv/argc-Hantieren an dieser Stelle?
-
Hallo CStoll,
in der Dokumentation von opencv braucht cvSafeImage folgende Eingabewerte:
int cvSaveImage( const char* filename, const CvArr* image );
Das Verwenden von argv/argc hat an der Stelle mom. keinen Sinn. Hatte da zwischenzeotlich ein paar Sachen ausprobiert, die inzwischen hinfällig sind.
Vielen Dank für die bisherigen Antworten.
-
Theo112 schrieb:
const CvArr * Video() { ... IplImage* img = 0; ... return img; }Also wenn IplImage nicht zufällig ein typedef auf CvArr (oder von CvArr abgeleitet) ist, dürfte das nicht funktionieren - der zurückgegebene Wert einer Funktion muß schon zu ihren Anforderungen passen.
-
Und wie mach ich das dann??
In der OpenCV Doku hab ich zu iplImage folgendes gefunden:
IPL image header
typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) /
int ID; / version (=0)/
int nChannels; / Most of OpenCV functions support 1,2,3 or 4 channels /
int alphaChannel; / ignored by OpenCV /
int depth; / pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported /
char colorModel[4]; / ignored by OpenCV /
char channelSeq[4]; / ditto /
int dataOrder; / 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images /
int origin; / 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style) /
int align; / Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead /
int width; / image width in pixels /
int height; / image height in pixels */
struct _IplROI *roi;/* image ROI. when it is not NULL, this specifies image region to process */
struct _IplImage *maskROI; /* must be NULL in OpenCV /
void *imageId; /* ditto /
struct _IplTileInfo *tileInfo; /* ditto /
int imageSize; / image data size in bytes
(=image->heightimage->widthStep
in case of interleaved data)/
char *imageData; /* pointer to aligned image data /
int widthStep; / size of aligned image row in bytes /
int BorderMode[4]; / border completion mode, ignored by OpenCV /
int BorderConst[4]; / ditto */
char *imageDataOrigin; /* pointer to a very origin of image data
(not necessarily aligned) -
it is needed for correct image deallocation */
}
IplImage;Aber wie deklariere ich das dann??
-
Und was hast du zu CvArr gefunden? Der Name klingt nach einer Containerklasse (Array), also müsstest du auch ein CvArr anlegen und dein(e) Image(s) dort einlagern, bevor du es zurückgeben kannst.
-
OpenCv:
CvArr
Arbitrary array
typedef void CvArr;
The metatype CvArr* is used only as a function parameter to specify that the function accepts arrays of more than a single type, for example IplImage*, CvMat* or even CvSeq*. The particular array type is determined at runtime by analyzing the first 4 bytes of the header.
-
Ich habe zwar openCV auch noch nicht benutzt, aber vielleicht reicht es ja, wenn man nur die Image-Daten zurückgibt. Anscheinend will cvSaveImage ja kein IplImage sondern nur die Pixeldaten. Da musst Du mal nachlesen. Wenn das der Fall sein sollte, dann muss der Aufbau (Graustufenbild oder RGB-Bild) natürlich übereinstimmen. Das wäre IMO dann aber eine sehr seltsame API.
const CvArr * Video() { ... IplImage* img = 0; ... return (CvArr *)img->imageData; }Nutzt Du openCV mit mingw oder mit Visual-C++?
Ich versuche auch gerade eine Kamera mit DirectShow und mingw zu betreiben. Eine sehr schmerzhafte Angelegenheit...