【发布时间】:2018-04-04 15:14:13
【问题描述】:
我想检测图像中的自定义“多条图案”。
图案看起来像这样,是一组平行的黑色条,宽度相同但高度不同,见下图:
此图案可能在图像上,也可能不在图像上,但如果是 - 我想知道它的位置。
注意:图案的颜色在任何情况下都是黑色。
注意:图案大小未知,可能很大也可能超小。
注意:图案条数为固定数。每次出现都相同(在本例中为 7)。
图像可能如下所示:
在执行代码搜索算法之后,这应该会发生:
任何帮助将不胜感激。提前一百万谢谢,Tempi。
注意:到目前为止我得到的代码(不工作)
Mat myImage; // this is the mat of the photo you can see above
Mat algorithmImage;
myImage.coptyTo(algorithmImage);
cvtColor(algorithmImage, algorithmImage, CV_RGB2HSV);
double imgThreshold = 20;
cv::inRange(algorithmImage, cv::Scalar(0, 0, 0, 0), cv::Scalar(180, 255, 30, 0), 20);
Mat canny;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
Canny( algorithmImage, canny, 3, 6, 3 );
findContours( canny, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
for( int i = 0; i<contours.size(); i++ ) {
// ??
}
bool isLineAlreadyFound(const Vec4i& _l1, const Vec4i& _l2) {
Vec4i l1(_l1), l2(_l2);
float length1 = sqrtf((l1[2] - l1[0])*(l1[2] - l1[0]) + (l1[3] - l1[1])*(l1[3] - l1[1]));
float length2 = sqrtf((l2[2] - l2[0])*(l2[2] - l2[0]) + (l2[3] - l2[1])*(l2[3] - l2[1]));
float product = (l1[2] - l1[0])*(l2[2] - l2[0]) + (l1[3] - l1[1])*(l2[3] - l2[1]);
if (fabs(product / (length1 * length2)) < cos(CV_PI / 30))
return false;
float mx1 = (l1[0] + l1[2]) * 0.5f;
float mx2 = (l2[0] + l2[2]) * 0.5f;
float my1 = (l1[1] + l1[3]) * 0.5f;
float my2 = (l2[1] + l2[3]) * 0.5f;
float dist = sqrtf((mx1 - mx2)*(mx1 - mx2) + (my1 - my2)*(my1 - my2));
if (dist > std::max(length1, length2) * 0.5f)
return false;
return true;
}
【问题讨论】:
-
任意大小和旋转使这成为一个难题。是否有一组特定的旋转,例如 45 度的倍数?
-
@stark:一点也不。当然,这不是 C++ 问题。在模式识别中,这是微不足道的。
-
微不足道?然而 3 个完全不同的答案。这些都没有建议如何识别结果模式的顶部或底部。
标签: c++ opencv image-processing template-matching