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

标签 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)来声明宽度和高度。

但是,输出的大小永远不会与矩形的外观相同。输出通常是一个矩形或正方形,颜色为黑色,但与它应该是的矩形不同且尺寸更小,它们也更小且不对齐。

我不知道为什么。

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

请帮帮我。 谢谢。

最佳答案

首先,您要重新使用 i 变量,这是个大问题。更改最顶层的 for 循环,这只会让人感到困惑。

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

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

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

关于c# - 如何从图像中访问检测到的人脸中的人脸像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904375/

相关文章:

c++ - 检查两个索引之间的回文

c++ - EXE 和 DLL 依赖 - 何时重新编译 EXE?

windows - 为什么Visual Studio 运行时库源代码存放在两个目录中?

在 Visual Studio Debug模式下运行时,C++ 对象引用损坏

c# - 如何使 Reflector 不被新语法阻塞

c# - 将 C# 项目迁移到 .NET 4.0 隐藏的问题和错误

c# - 将记录添加到数据库后在特定时间触发 WebJob

c++ - boost-1.55.0 未定义对 `boost::thread::join() 的引用,即使在链接到正确的库之后

c++ - 异步代理库和数据共享

c# - 关于 C# 命名空间结构的困惑