【发布时间】:2014-04-21 01:48:33
【问题描述】:
输入:人脸图像
问题:在应用 Canny 查找轮廓之前对图像进行阈值处理但不返回面罩
期望的输出如果输入不同的面部,它应该生成一个合适的面罩(面部区域白色和背景白色)
用苹果图片试过..效果很好
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(){
Mat right=imread("front.jpg");
Mat img1;
cvtColor(right, img1, CV_RGB2GRAY);
threshold(img1,img1,160,255,cv::THRESH_BINARY);
Canny(img1, img1, 128, 350);
vector< vector<Point> > contours;
findContours(img1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
Mat mask = Mat::zeros(img1.rows, img1.cols, CV_8UC1);
drawContours(mask, contours, -1, Scalar(255), CV_FILLED);
normalize(mask.clone(), mask, 0.0, 255.0, CV_MINMAX, CV_8UC1);
imshow("original", right);
imshow("thresh",img1);
imshow("mask", mask);
waitKey(0);
return 0;
}
这是我使用的图像
请忽略下面的前 3 个 cmets
【问题讨论】:
-
因此您可以定义眼角:矩形(垂直)中间最靠近耳朵位置的点。或者如果您知道面部方向,您可以定义眼角,即眼睛矩形中间的最外侧位置。
-
我认为更稳健的方法是对内部 ROI 设置阈值并在那里进行简单的 Harris 角检测。它很可能会拿起两个眼角。当然,你需要做一些额外的检查,看看那个角是朝向耳朵还是鼻子(取决于数据集)。
-
@Steph 似乎阈值二进制反转对于上面的图像效果很好,像
threshold(img1,img1,160,255,cv::THRESH_BINARY_INV);这样的东西在这里看到结果i.stack.imgur.com/VtB3Q.jpg,你也不需要在找到轮廓之前做精明。 -
你好@Micka。记住你写的混合函数,我想要一个单独的函数来生成对齐图像的面罩,然后在混合函数中使用它。但它不起作用:/ 这是上面图片的 findContours 的图片i.imgur.com/5BaqwqJ.jpg
-
那么你为什么不设置背景的颜色范围(那个灰色的颜色,但它必须是RGB的范围,而不是单一的RGB,更好的是HSV颜色空间,看看HSV 颜色分割)为黑色,所有其他像素为白色。
标签: c++ opencv computer-vision mask