我正试图通过网络摄像头同时检测不同的颜色。下面是我的代码,但是我收到了一个错误:
错误:错误的论点<数组应该是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;
}
答案 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
或一些未初始化的垃圾,这两者都是非常糟糕的事情。
要解决此问题,只需删除声明hsv
,blue_mask
和green_mask
的行。然后你的程序将按预期工作。