【发布时间】:2013-11-28 22:16:40
【问题描述】:
我通过调用 DetectMultiScale 得到一个 Rect 向量:
face_cascade.detectMultiScale(ImgGray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE);
但是比较需要垫子:
compare(OriginalImg,roi,dist,CMP_EQ);
如何将 Rect 转换为 Mat 进行比较,或者有没有办法比较 Rects?
【问题讨论】:
我通过调用 DetectMultiScale 得到一个 Rect 向量:
face_cascade.detectMultiScale(ImgGray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE);
但是比较需要垫子:
compare(OriginalImg,roi,dist,CMP_EQ);
如何将 Rect 转换为 Mat 进行比较,或者有没有办法比较 Rects?
【问题讨论】:
0 - 它是compare,而不是detect。它执行per element comparison
1- 您不能将 Rect 转换为 Mat,因为一个定义了 4 点几何形状,而另一个定义了 3D 矩阵。
2- 你可以在crop 和Mat 中使用Rect,并在compare 中使用新的Mat
3- 人脸识别并不是那么简单。请查看this tutorial。
【讨论】:
如果您想比较 2 个图像,您的 compare 函数将 2 个 cv::Mat 作为第一个输入。
要从ImgGray 中获取 roi,您必须从detectMultiScale 给出的 ROI 中提取一个新 Mat
Mat ImgGray;
vector<Rect> faces;
face_cascade.detectMultiScale(ImgGray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE);
Rect roiRect = faces[0];
Mat roi = ImgGray (roiRect);
compare(OriginalImg,roi,dist,CMP_EQ);
OriginalImg、dist 和 roi 具有相同的大小和类型。
这能解决您的问题吗?
【讨论】:
src1 : first input array or a scalar, when it is an array, it must have a single channel.来自ImgGray的roi是一个单通道矩阵,确保OriginalImg也只有一个通道组成。顺便说一句,C.Canberk Bac 说得对,特征识别并不像“比较” 2 投资回报率那么简单。