对不起,如果标题给了你错误的想法,我试着让它尽可能简短。简而言之,我想要做的是用Viola-Jones算法(已经实现)检测面部,将其保存在单独的图像中,将该图像转换为灰度,然后将灰度图像拍回到其原始位置,从而产生一个网络摄像头显示屏,所有面部(以及任何误报,我猜)都是灰色的,周围是绿色矩形。但是,我收到以下错误消息:
proba.exe中0x771115de处的未处理异常:Microsoft C ++异常:cv ::异常位于>内存位置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 );
抱歉,如果我错过了明显的答案。
答案 0 :(得分:1)
您的裁剪灰度图像croppedImage
是1通道图像,但您尝试将其叠加到3通道RGB图像frame
上。换句话说,
copyTo
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size())));
期望croppedImage
与[{1}}拥有相同数量的频道。这就是你收到错误的原因。
编辑要解决您的问题,您可以尝试将灰度裁剪图像转换回RGB格式(它仍然看起来像灰度图像)。像
这样的东西frame