当定义为全局时,类停止工作

时间:2013-03-16 12:37:59

标签: c++ class global local definition

我正在编写一个使用Code Laboratories驱动程序(http://www.codelaboratories.com/products/eye)使用PSEye相机的相机数据的程序。所以我创建了一个名为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;
    }

0 个答案:

没有答案