简体   繁体   中英

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

I made a motion detection program using opencv and c++ and i got this error

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

terminate called after throwing an instance of 'cv::Exception' what(): /usr/src/packages/BUILD/opencv-2.4.1+dfsg/modules/imgproc/src/color.cpp:3205: error: (-215) scn == 3 || scn == 4 in function cvtColor

and this is my source code

// 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;    

}

The "cvtColor" function expects the input image to have 3 or 4 channels for the kind of conversion you use (CV_RGB2GRAY) - that's what the complaint is about. Check that the input satisfies this condition (or isn't empty).

Also, since you are changing the number of channels, I'm not sure it's ok to use the function to work "in-place" - you should probably make a new variable for the result of the function.

color.cpp source for reference - https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/color.cpp

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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