Я хочу обнаружить на изображении пользовательский "шаблон из нескольких полос".
Паттерн выглядит так: группа параллельных черных полос одинаковой ширины, но разной высоты, см. это изображение:
Этот шаблон может быть на изображении или даже не быть, но если он есть, я хотел бы получить его позицию.
Примечание. Цвет рисунка всегда черный.
Примечание. Размер шаблона неизвестен, поэтому он может быть большим или очень маленьким.
Примечание. Количество полос шаблона является фиксированным числом. Оно будет одинаковым (в данном случае 7) для каждого случая.
Изображение может выглядеть так:
И после выполнения алгоритма поиска кода должно получиться вот это:
Любая помощь будет очень признательна. Заранее огромное спасибо, Темпи.
Примечание. Код, который я получил на данный момент, (не работает)
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;
}