1

对不起,如果标题给了你错误的想法,我试图让它尽可能简短。简而言之,我想做的是用 Viola-Jones 算法(已经实现)检测人脸,将其保存在单独的图像中,将该图像转换为灰度,然后将灰度图像拍回其原始位置,从而导致一个网络摄像头显示所有面孔(以及任何误报,我想)都是灰色的,并被绿色矩形包围。但是,我收到以下错误消息:

proba.exe 中 0x771115de 处的未处理异常:Microsoft C++ 异常:cv::Exception at >memory location 0x003ef2c8..

这是我的代码(相关部分),任何建议/建议将不胜感激:

face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( int i = 0; i < faces.size(); i++ )
{
Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
Point pt2(faces[i].x, faces[i].y); 

Rect myROI(pt1, pt2);
Mat croppedImage;
Mat(frame, myROI).copyTo(croppedImage);
cvtColor(croppedImage, croppedImage, CV_BGR2GRAY ); //the last four lines process the image

croppedImage.copyTo(frame(Rect(pt1, croppedImage.size()))); //this should copy the image back into its' original location

rectangle(frame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);  
}
//-- Show what you got
imshow( window_name, frame );

对不起,如果我错过了明显的答案。

4

1 回答 1

1

您裁剪的灰度图像是croppedImage1 通道图像,但您试图将其叠加到 3 通道 RGB 图像上frame。换句话说,函数copyTo

croppedImage.copyTo(frame(Rect(pt1, croppedImage.size())));

期望croppedImage具有与 相同数量的通道frame。这就是您收到错误的原因。

编辑要解决您的问题,您可以尝试将灰度裁剪图像转换回 RGB 格式(它仍然看起来像灰度图像)。就像是

cvtColor(croppedImage, croppedImage, CV_BGR2GRAY );  // to grayscale
cvtColor(croppedImage, croppedImage, CV_GRAY2BGR );  // to RGB
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size())));
于 2013-05-07T13:40:05.700 回答