# How to use generalized Hough

in this post @Tetragramm clarify the documentation of the generalized HoughTransform in OpenCV a bit. As I still do not find any tutorial or further information about this implementation, i hope someone can help me to get the following crashing code to work. update:->@berak found a sample of this function, and i was able to fix the code, so that it does not crash anymore. (Thank you very much!)

The remaining question is why the key instance is not found properly: I assume that it sicks close to the threshold which has to be set for Canny. In the documentation for setCannyHighThresh it only says: "Canny low/high threshold." I don't find templ.png from the given example and would assume that both input images are filtered with the same canny-filter, arn't they?

update: I found both used images pic1.png and templ.png from the sample in this folder.

My problem is, that even with the given example settings i get wrong results: I detect 4 wrong objects shown in the output image below. Can someone try the code from the sample with this pictures as a confirmation?

The key-images are taken from this tutorial Thank you for your help!

int main()
{
Mat queryImage, //image where template key is located
bigTemplateImage, //uncropped template
templateImage; //cropped template

// Crop template
Rect myROI(197, 36, 80, 165);
templateImage = bigTemplateImage(myROI);

Ptr<GeneralizedHoughGuil> ghB =  createGeneralizedHoughGuil();
ghB->setTemplate(templateImage);

vector<Vec4f> position;
TickMeter tm;
tm.start();
ghB->detect(queryImage, position);
tm.stop();

cout << "Found : " << position.size() << " objects" << endl;
cout << "Detection time : " << tm.getTimeMilli() << " ms" << endl;

Mat out;
cv::cvtColor(queryImage, out, COLOR_GRAY2BGR);

for (size_t i = 0; i < position.size(); ++i)
{
Point2f pos(position[i][0], position[i][1]);
float scale = position[i][2];
float angle = position[i][3];

RotatedRect rect;
rect.center = pos;
rect.size = Size2f(queryImage.cols * scale, queryImage.rows * scale);
rect.angle = angle;

Point2f pts[4];
rect.points(pts);

line(out, pts[0], pts[1], Scalar(0, 0, 255), 3);
line(out, pts[1], pts[2], Scalar(0, 0, 255), 3);
line(out, pts[2], pts[3], Scalar(0, 0, 255), 3);
line(out, pts[3], pts[0], Scalar(0, 0, 255), 3);
}

imshow("out", out);
waitKey();
return 0;
}


b.bmp: template_original.jpg

result of sample code

edit retag close merge delete