C# 如何从图像中访问检测到的人脸中的人脸像素?

C# 如何从图像中访问检测到的人脸中的人脸像素?,c#,c++,visual-c++,image-processing,opencv,C#,C++,Visual C++,Image Processing,Opencv,我已经使用nashruddin.com中的源代码在我的网络摄像头的实时视频流中检测到的人脸上绘制了一个矩形 我想把脸或者整个长方形换成黑色。 我已尝试使用此页面中的解决方案: 然而,我不能让脸或矩形变成黑色 我实际尝试过的一个例子是: //do the capture frame all those for( int i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) { CvRect *r = ( CvRect* )cvGetS

我已经使用nashruddin.com中的源代码在我的网络摄像头的实时视频流中检测到的人脸上绘制了一个矩形

我想把脸或者整个长方形换成黑色。 我已尝试使用此页面中的解决方案:

然而,我不能让脸或矩形变成黑色

我实际尝试过的一个例子是:

//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 }}
//执行捕获帧所有这些操作
对于(int i=0;i<(面?面->总计:0);i++){
CvRect*r=(CvRect*)cvGetSeqElem(面,i);
CVC矩形(框架,
CVP点(r->x,r->y),
C点(r->x+r->宽度,r->y+r->高度),
CV_RGB(255,0,0,1,8,0);
INTX=r->x;
int y=r->y;
int width=r->width;
int height=r->height;
对于(inti=x;iwidthStep))[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

但是,输出的大小与矩形的大小不同。输出通常是一个矩形或正方形,颜色为黑色,但与它假设的矩形大小不同且较小,它们也较小且不对齐

我不知道为什么

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

请帮帮我。
谢谢。

首先,您使用的是
i
变量,这是一个大问题。将最上面的
更改为
循环,这很混乱

另外,最里面的两个
for
循环是错误的。它们应该是:

for(int i = y; i < y + height; i++){
    for(int j = x; j < x + width; j++){
for(int i=y;i
请记住,您在绝对坐标上循环,而宽度和高度是相对项。此外,通常您希望
y
变量位于外循环上,因为它使内存访问更快(至少在使用OpenCV时)