- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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。
这是我想要实现的图片(一只眼角处的红点):
最佳答案
我很欣赏你追求简单的目标。白色物体颜色并不总是会产生白色像素,并且由于镜面反射或过度曝光,非白色颜色可能会变成白色像素。顺便说一下,你的眼角的灰度强度是 209,而不是 255。并且非常接近这个强度(值为 200)还有一些其他像素,如下图所示。这意味着依靠像素强度可能不会让您走得太远。
您提到了“肤色和眼角第一个白色像素之间的某种差异”,但您没有测量差异 - 您只检查了其中一个值。事实上,您可以根据需要检查任意多的差异,如下面的过滤器所示。比较差异可能是一种您可以改进的好方法,但要查看特定位置的差异。
只需使用 matchTemplate() 将您的图像与一些模式过滤器进行卷积即可找到适合进一步分析的区域。例如,在你的灰色模糊图像与下面的过滤器(由 3 个水平条纹组成:白色、深色、白色)卷积后,我得到了这个结果,你可以轻松定位眼睛甚至嘴巴的垂直位置。要获得更多过滤器配置,请尽早查看本文 Ada boost paper for face detection.
关于c++ - 使用颜色差异查找眼角坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22137953/
我正在使用 OpenCV4Android 为手机创建基本的情绪检测系统。我的系统已经能够找到嘴并进行一些预处理。我从 Canny 获取面部对象的结果很好: 示例面 1:https://dl.dropb
我是一名优秀的程序员,十分优秀!