我使用的是opencv 2.4.2和c ++。我有一张脸部图片。从图片的左侧开始,我想以最不复杂的方式确定眼睛一角的坐标。我的计划如下:
面部图像输入
从顶部扫描图像,直到它在肤色和眼角处的第一个白色像素之间遇到某种差异
在这个角落画一种红点
不继续扫描图像
显示该点的(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。
这是我想要实现的图片(一只眼角的红点):
答案 0 :(得分:1)
我很欣赏你的简单目标。白色物体颜色并不总是导致白色像素,并且由于镜面反射或过度曝光,非白色可能会变成白色像素。顺便说一下,你的眼角有灰色强度209,而不是255.并且非常接近这个强度(在值200处),还有一些其他像素,如下图所示。这意味着依靠像素强度可能不会让你走得太远。
你提到了“皮肤颜色和眼角处的第一个白色像素之间的差异”但你没有测量差异 - 你只检查了其中一个值。实际上,您可以根据需要检查尽可能多的差异,如下面的过滤器所示。比较差异可能是一种很好的方法,您可以改进,但要查看特定位置的差异。
使用matchTemplate()使用一些模式过滤器对图像进行卷积,以找到进一步分析的好区域。例如,在将灰色模糊图像与下面的滤镜(由3个水平条纹组成:白色,深色,白色)卷积之后,我得到了这个结果,您可以轻松找到眼睛的垂直位置甚至是嘴巴。要获得更多过滤器配置,请尽早查看本文Ada boost paper for face detection.