繁体   English   中英

cvtColor断言失败(带有C ++的OpenCV)抛出实例cv :: exception

[英]cvtColor assertion failed ( OpenCV with C++ ) throwing an instance cv::exception

我使用opencv和c ++制作了运动检测程序,但出现此错误

root@raspberrypi:/home/pi/motion_src/src# OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /usr/src/packages/BUILD/opencv-2.4.1+dfsg/modules/imgproc/src/color.cpp, line 3205

抛出'cv :: Exception'what()实例后终止终止调用:/usr/src/packages/BUILD/opencv-2.4.1+dfsg/modules/imgproc/src/color.cpp:3205:错误:(- 215)scn == 3 || scn == 4在函数cvtColor中

这是我的源代码

// Take images and convert them to gray
Mat result, result_cropped;
Mat prev_frame = result = cvQueryFrame(camera);
Mat current_frame = cvQueryFrame(camera);
Mat next_frame = cvQueryFrame(camera);
cvtColor(current_frame, current_frame, CV_RGB2GRAY);
cvtColor(prev_frame, prev_frame, CV_RGB2GRAY);
cvtColor(next_frame, next_frame, CV_RGB2GRAY);

// d1 and d2 for calculating the differences
// result, the result of and operation, calculated on d1 and d2
// number_of_changes, the amount of changes in the result matrix.
// color, the color for drawing the rectangle when something has changed.
Mat d1, d2, motion;
int number_of_changes, number_of_sequence = 0;
Scalar mean_, color(0,255,255); // yellow

// Detect motion in window
int x_start = 10, x_stop = current_frame.cols-11;
int y_start = 350, y_stop = 530;

// If more than 'there_is_motion' pixels are changed, we say there is motion
// and store an image on disk
int there_is_motion = 5;

// Maximum deviation of the image, the higher the value, the more motion is allowed
int max_deviation = 20;

// Erode kernel
Mat kernel_ero = getStructuringElement(MORPH_RECT, Size(2,2));

// All settings have been set, now go in endless loop and
// take as many pictures you want..
while (true){
    // Take a new image
    prev_frame = current_frame;
    current_frame = next_frame;
    next_frame = cvQueryFrame(camera);
    result = next_frame;
    cvtColor(next_frame, next_frame, CV_RGB2GRAY);

    // Calc differences between the images and do AND-operation
    // threshold image, low differences are ignored (ex. contrast change due to sunlight)
    absdiff(prev_frame, next_frame, d1);
    absdiff(next_frame, current_frame, d2);
    bitwise_and(d1, d2, motion);
    threshold(motion, motion, 35, 255, CV_THRESH_BINARY);
    erode(motion, motion, kernel_ero);

    number_of_changes = detectMotion(motion, result, result_cropped,  x_start, x_stop, y_start, y_stop, max_deviation, color);

    // If a lot of changes happened, we assume something changed.
    if(number_of_changes>=there_is_motion)
    {
        if(number_of_sequence>0){ 
            saveImg(result,DIR,EXT,DIR_FORMAT.c_str(),FILE_FORMAT.c_str());
            saveImg(result_cropped,DIR,EXT,DIR_FORMAT.c_str(),CROPPED_FILE_FORMAT.c_str());
        }
        number_of_sequence++;
    }
    else
    {
        number_of_sequence = 0;
        // Delay, wait a 1/2 second.
        cvWaitKey (DELAY);
    }
}
return 0;    

}

“ cvtColor”函数期望输入图像具有3或4个通道,以进行您使用的转换类型(CV_RGB2GRAY)-这就是投诉的原因。 检查输入是否满足此条件(或不为空)。

另外,由于您正在更改通道数,因此我不确定使用该函数“就地”工作是否可行-您可能应该为函数的结果创建一个新变量。

color.cpp来源以供参考-https: //github.com/Itseez/opencv/blob/master/modules/imgproc/src/color.cpp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM