使用颜色差异查找眼角的坐标

时间:2014-03-03 03:02:33

标签: c++ opencv image-processing computer-vision coordinates

我使用的是opencv 2.4.2和c ++。我有一张脸部图片。从图片的左侧开始,我想以最不复杂的方式确定眼睛一角的坐标。我的计划如下:

  1. 面部图像输入

  2. 从顶部扫描图像,直到它在肤色和眼角处的第一个白色像素之间遇到某种差异

  3. 在这个角落画一种红点

  4. 不继续扫描图像

  5. 显示该点的(x,y)坐标

  6. 到目前为止我所拥有的:

    int main() {
        Mat img = imread("MVC-003F.jpg");
    
        for(int i = 0; i < img.rows; i++) {
            for(int j = 0; j < img.cols; j++) {
                Vec3b color = img.at<Vec3b>(Point(i,j));
                if(color.val[0] == 255 && color.val[1] == 255 && color.val[2] == 255)
                    cout << (Point(i,j)) << endl;
            }
    
        }
    
        imshow("out", img);
        waitKey(0);
        return 0;
    }
    

    显然,这并不能解决我的问题,而是会返回错误。扫描图像后,我无法确定是否需要cvtColor到HSV和阈值或继续使用RGB。

    这是我想要实现的图片(一只眼角的红点):

    enter image description here

1 个答案:

答案 0 :(得分:1)

我很欣赏你的简单目标。白色物体颜色并不总是导致白色像素,并且由于镜面反射或过度曝光,非白色可能会变成白色像素。顺便说一下,你的眼角有灰色强度209,而不是255.并且非常接近这个强度(在值200处),还有一些其他像素,如下图所示。这意味着依靠像素强度可能不会让你走得太远。

enter image description here

你提到了“皮肤颜色和眼角处的第一个白色像素之间的差异”但你没有测量差异 - 你只检查了其中一个值。实际上,您可以根据需要检查尽可能多的差异,如下面的过滤器所示。比较差异可能是一种很好的方法,您可以改进,但要查看特定位置的差异。

使用matchTemplate()使用一些模式过滤器对图像进行卷积,以找到进一步分析的好区域。例如,在将灰色模糊图像与下面的滤镜(由3个水平条纹组成:白色,深色,白色)卷积之后,我得到了这个结果,您可以轻松找到眼睛的垂直位置甚至是嘴巴。要获得更多过滤器配置,请尽早查看本文Ada boost paper for face detection.

enter image description here enter image description here enter image description here