我正在编写一个程序,该程序使用来自 PSEye 相机的相机数据,使用 Code Laboratories 驱动程序 ( http://www.codelaboratories.com/products/eye )。所以我创建了一个名为 PSEyeGetter.h 的头文件来直接与驱动程序交互。当我在这样的函数中使用这个类作为局部变量时(注意我使用 OpenCV 来显示图像):
void Test2()
{
cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
PSEyeGetter Get = PSEyeGetter(CLEYE_MONO_PROCESSED, CLEYE_VGA, 30);
IplImage* img_cam = cvCreateImage(cvSize(Get.W, Get.H), 8, Get.Size);
while (1)
{
if (Get.GetFrame())
{
int Length = Get.W * Get.H * Get.Size;
for (int cnt = 0; cnt < Length; cnt++)
{
img_cam->imageData[cnt] = Get.CurrentColours[cnt];
}
}
cvShowImage("Image", img_cam);
if (cvWaitKey(10) == 27) break;
}
cvReleaseImage(&img_cam);
cvDestroyAllWindows();
}
我没有问题,图像显示完美。但是当我尝试定义 PSEyeGetter 一个像这样的全局变量时:
PSEyeGetter Cam;
IplImage* img_cam;
void OpenCam()
{
Cam = PSEyeGetter(CLEYE_MONO_PROCESSED, CLEYE_VGA, 30);
img_cam = cvCreateImage(cvSize(640, 480), 8, 1);
cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
}
void GetImage()
{
while (1)
{
if (Cam.GetFrame())
{
int Length = Cam.W * Cam.H * Cam.Size;
for (int cnt = 0; cnt < Length; cnt++)
{
Image->imageData[cnt] = Cam.CurrentColours[cnt];
}
cvShowImage("Image", img_cam);
if (cvWaitKey(10) == 27) break;
}
}
cvReleaseImage(&img_cam);
cvDestroyAllWindows();
}
它突然停止正确获取图像。它链接到相机并获取图像,但图像只是蓝色的。任何想法为什么会这样?
CurrentColours = (PBYTE)malloc(W * H* Size * sizeof(byte));
PBYTE 定义为 (byte*)的其他有用信息位
。它是在创建 PSEyeGetter 时定义的,只有在类被销毁时才释放。
我需要将其定义为全局,因为这是需要在多个线程上操作的更大程序的一部分,因此我需要能够从多个位置访问相机。
感谢您的任何帮助。:)
编辑:PSEyeGetter 的构造函数
PSEyeGetter::PSEyeGetter(CLEyeCameraColorMode ColourMode, CLEyeCameraResolution Resolution, float FrameRate)
{
IsReady = false;
Mode = ColourMode;
Res = Resolution;
Rate = FrameRate;
switch(Mode)
{
case CLEYE_MONO_PROCESSED:
Size = 1;
break;
case CLEYE_COLOR_PROCESSED:
Size = 4;
break;
case CLEYE_MONO_RAW:
Size = 1;
break;
case CLEYE_COLOR_RAW:
Size = 4;
break;
case CLEYE_BAYER_RAW:
Size = 1;
break;
}
if (!FindCam()) return;
CurrentColours = (PBYTE)malloc(W * H* Size * sizeof(byte));
}
bool PSEyeGetter::FindCam()
{
if (IsReady)
{
CLEyeCameraStop(Cam);
CLEyeDestroyCamera(Cam);
IsReady = false;
}
if (CLEyeGetCameraCount() == 1)
{
guid = CLEyeGetCameraUUID(0);
Cam = CLEyeCreateCamera(guid, Mode, Res, Rate);
CLEyeCameraGetFrameDimensions(Cam, W, H);
IsReady = true;
CLEyeCameraStart(Cam);
CLEyeCameraLED(Cam, true);
}
else
{
IsReady = false;
}
return IsReady;
}