错误:错误的论点<数组应该是CvMat或IplImage>

时间:2013-07-08 21:35:15

标签: c opencv

我正试图通过网络摄像头同时检测不同的颜色。下面是我的代码,但是我收到了一个错误:

  

错误:错误的论点<数组应该是CvMat或IplImage>功能未知。

伴随着:

  

0x7c812fd处的未处理异常:cv ::内存位置0x0011fb70处的异常

我认为错误可能是由

引起的
IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); 

但我不确定并且知道如何修复它。有人可以给我一些提示吗?

    #include "stdafx.h"

    #include <cv.h>
    #include <highgui.h>

// from here to main function is my part.
    IplImage* GetThresholdedImage(IplImage* imgHSV, CvScalar lower, CvScalar upper)
    {       
        IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);
        cvInRangeS(imgHSV, lower, upper, imgThresh); 
        return imgThresh;
    }

    IplImage* hsv;

    CvScalar blue_lower = cvScalar(110,60,10);
    CvScalar blue_upper = cvScalar(120,256,256);
    CvScalar green_lower = cvScalar(40,60,10);
    CvScalar green_upper = cvScalar(71,256,256);

    /* Get the images thresholded for blue and green. */
    IplImage* blue_mask = GetThresholdedImage(hsv, blue_lower, blue_upper);
    IplImage* green_mask = GetThresholdedImage(hsv, green_lower, green_upper);

    int main(){
          CvCapture* capture =0;       

          capture = cvCaptureFromCAM(0);
          if(!capture){
                printf("Capture failure\n");
                return -1;
          }

          IplImage* frame=0;
          cvNamedWindow("Video");      
          cvNamedWindow("Ball");


          while(true){

                frame = cvQueryFrame(capture);            
                if(!frame) break;

                frame=cvCloneImage(frame); 
                cvSmooth(frame, frame, CV_GAUSSIAN,3,3); 

                IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); 
                cvCvtColor(frame, imgHSV, CV_BGR2HSV); 
                IplImage* imgThresh = GetThresholdedImage(imgHSV, blue_lower, blue_upper);
                IplImage* imgThresh2 = GetThresholdedImage(imgHSV, green_lower, green_upper);
                cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN,3,3);
                cvSmooth(imgThresh2, imgThresh2, CV_GAUSSIAN,3,3);
                cvShowImage("Ball", imgThresh);  
                cvShowImage("Ball2", imgThresh2);
                cvShowImage("Video", frame);


                cvReleaseImage(&imgHSV);
                cvReleaseImage(&imgThresh);   
                cvReleaseImage(&imgThresh2);
                cvReleaseImage(&frame);


                int c = cvWaitKey(10);
                if((char)c==27 ) break;      
          }

          cvDestroyAllWindows() ;
          cvReleaseCapture(&capture);     

          return 0;
    }

1 个答案:

答案 0 :(得分:1)

看起来您可能想要阅读pre-main initialization。你的问题不在行:

IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);

但在这一个:

IplImage* blue_mask = GetThresholdedImage(hsv, blue_lower, blue_upper);
在致电blue_mask 之前,

green_mask(以及main())必须计算。但是,您还声明了IplImage* hsv;而没有初始化它,因此错误说您有一个错误的参数。 hsv将是NULL或一些未初始化的垃圾,这两者都是非常糟糕的事情。

要解决此问题,只需删除声明hsvblue_maskgreen_mask的行。然后你的程序将按预期工作。