如何从图像中访问检测到的面部中的面部像素?

时间:2011-10-26 14:45:01

标签: c# c++ visual-c++ image-processing opencv

我使用nashruddin.com中的源代码从我网络摄像头的实时视频流中检测到的面部上绘制一个矩形。

我想将脸部或整个矩形更改为黑色。 我尝试过使用此页面中的解决方案:http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000

然而,我不能让脸部或矩形变黑。

我实际尝试过,其中一个例子是这样的:

//do the capture frame all those

 for( int i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) {

 CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );        
 cvRectangle( frame,
              cvPoint( r->x, r->y ),
              cvPoint( r->x + r->width, r->y + r->height ),
              CV_RGB( 255, 0, 0 ), 1, 8, 0 );

 int x=r->x;

 int y=r->y;

 int width=r->width;

 int height=r->height;

 for(int i=x; i<=height; i++){

 for(int j=y; j<=width; j++){

 //data[i*step+j*channels+0] = 0;//3=yellow; 2=blue; 1=purple;

((unsigned char *)(frame->imageData + i*frame->widthStep))[j*frame->nChannels + 0]=0;// B 

((unsigned char *)(frame->imageData + i*frame->widthStep))[j*frame->nChannels + 1]=0; // G 

((unsigned char *)(frame->imageData + i*frame->widthStep))[j*frame->nChannels + 2]=0; // R }}

我想要做的是,我通过使用在cvRectangle中使用的点(即r点)来声明宽度和高度。

但是,输出的大小永远不会与矩形的大小相同。输出通常是一个矩形或正方形,颜色为黑色,但与矩形不同,尺寸不同,它假设是这样,而且它们也更小并且没有对齐。

我不知道为什么。

请帮忙。 目的是用黑色覆盖脸部,用黑色像素隐藏脸部。

请帮帮我。 谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您正在重新使用i变量,这是一个很大的问题。改变最顶层的for循环,这只是令人困惑。

此外,您最内层的两个for循环是错误的。他们应该是:

for(int i = y; i < y + height; i++){
    for(int j = x; j < x + width; j++){

请记住,您正在循环绝对坐标,宽度和高度是相对术语。通常,您希望y变量位于外部循环上,因为它可以更快地访问内存(至少使用OpenCV)。