OpenCV,动态修改网络摄像头显示

时间:2013-05-07 13:28:21

标签: c++ opencv grayscale roi

对不起,如果标题给了你错误的想法,我试着让它尽可能简短。简而言之,我想要做的是用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 );

抱歉,如果我错过了明显的答案。

1 个答案:

答案 0 :(得分:1)

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

中的函数copyTo
croppedImage.copyTo(frame(Rect(pt1, croppedImage.size())));

期望croppedImage与[{1}}拥有相同数量的频道。这就是你收到错误的原因。

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

这样的东西
frame