Ich versuche, Lineal auf dem Bild zu erkennen, und ich werde den nächsten Prozess folgen.OpenCV Linien/Lineal Erkennung
1) bereites Bild (Blur, Canny, ect)
2) erkennen von Linien
3) bereiten Satz paralleler Linien
nächste habe ich versuche HoughLinesP
Methode und schaue ich es in meinem Fall nicht anwenden kann, weil ich den Winkel der Linien weiß es nicht, so ist es nicht Lineal vertikale Linien gefunden, aber horizontal gefunden (zum Beispiel) und jeder Herrscher Linie besteht aus vielen dünnen Linien, das wird ein Problem Prozess:
der Code:
std::vector<cv::Vec4i> lines_std;
cv::HoughLinesP(grayMat, lines_std, 1, CV_PI/90, 50, 10, 0);
// drawing lines (with random color)
for(size_t i = 0; i < lines_std.size(); i++)
{
cv::line(originalMat, cv::Point(lines_std[i][0], lines_std[i][1]),
cv::Point(lines_std[i][2], lines_std[i][3]), cv::Scalar(arc4random_uniform(155)+100,
arc4random_uniform(155)+100,
arc4random_uniform(155)+100), 1);
}
auch habe ich LineSegmentDetector
versucht, und bekam mehr näher Ergebnis, das ich erwartete:
Code:
vector<Vec4f> lines_std;
Ptr<LineSegmentDetector> ls = createLineSegmentDetector(LSD_REFINE_NONE);
ls->detect(grayMat, lines_std);
aber hier stand ich mit einigen Problemen (und sieht es keine Möglichkeit createLineSegmentDetector
anzupassen ist): nicht alle Linien erfasst wurden, Linien erkennt in der Mitte nicht aber auf die Seiten und manchmal nur auf der linken oder rechten Seite, aber ich muss die Mitte der fetten Linie bekommen, weil dies in den Berechnungen als nächstes verwendet wird.
Also, was ist der richtige Weg, um alle Linien (und jede Linie nur einmal in der Mitte der fetten Linie) zu finden?
aktualisieren
versucht HoughLines
auch:
Vektorlinien;
cv::HoughLines(grayMat, lines, 1, CV_PI/90, 100 , 100, 0);
for(size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
cv::Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
cv::line(originalMat, pt1, pt2, cv::Scalar(0,255,0), 3, CV_AA);
}
aber das Ergebnis sieht auch seltsam (und Berechnungen braucht viel Zeit):