【问题标题】:Find coordinate of eye corner using difference in color使用颜色差异查找眼角坐标
【发布时间】:2018-07-13 02:05:56
【问题描述】:

我正在使用 opencv 2.4.2 和 c++。我有一张人脸图像。从图片的左侧开始,我想以最简单的方式确定一个眼角的坐标。我的程序如下:

  1. 人脸图像输入

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

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

  4. 不继续扫描图像

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

到目前为止我所拥有的:

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。

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

【问题讨论】:

  • 除非您能保证图像具有某种类型/质量,否则对于任何类型的用于检测眼睛位置的简单颜色匹配算法,都有许多病态和非病态的反例。
  • 脸部图片会像上面那张或亚洲血统的人

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多