2013-07-08 39 views
-1

我試圖通過網絡攝像頭同時檢測不同的顏色。下面是我的代碼,但我得到一個錯誤:錯誤:錯誤的參數<數組應該是CvMat或IplImage>

ERROR: Bad argument < Array should be CvMat or IplImage> in unknown function.

與走來:

Unhandled exception at 0x7c812fd: cv:: Exception at memory location 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; 
    } 
+0

一個問題,爲什麼你有行'frame = cvCloneImage(frame);'? – alrikai

+0

@alrikai'frame'是[不允許](http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=cvqueryframe#IplImage*%20cvQueryFrame%28CvCapture*%20capture%29)除非它被首先克隆。 – Aurelius

+0

考慮到你[另一篇文章](http://stackoverflow.com/q/17517921/1601291),你可能想考慮學習C稍微好一點,然後再[複製粘貼代碼](http://stackoverflow.com/a/17478700/1601291)willy-nilly。您可以在[本頁]底部找到一些好書(http://stackoverflow.com/tags/c/info)。我的意思是說沒有任何冒犯 - 但在解決像copmuter視覺這樣更爲棘手的問題之前,掌握好語言是很重要的。 – Aurelius

回答

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或一些未初始化的垃圾,這兩者都是非常糟糕的事情。

要解決該問題,只需刪除聲明hsv,blue_maskgreen_mask的行。然後你的程序將按照你的預期工作。

相關問題