我试图检测图像上的统治者,我要按照下面的过程:OpenCV的线/尺检测
1)准备图像(模糊,康力,ECT)
2)检测线
3)制备组平行线
下一个我试图HoughLinesP
方法,看起来我不能在我的案件,不适用,因为我不知道线的角度,所以它没有找到尺子垂直线,却发现水平(例如)和每一个标尺线由许多细线,那将是对过程的一个问题:
代码:
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);
}
也是我试过LineSegmentDetector
,并获得更接近的结果我的预期:
代码:
vector<Vec4f> lines_std;
Ptr<LineSegmentDetector> ls = createLineSegmentDetector(LSD_REFINE_NONE);
ls->detect(grayMat, lines_std);
但在这里,我面临着一些问题(而且看上去也没有办法来定制createLineSegmentDetector
):检测 不是所有的线;线检测不在中心,而是在双方,有时只在左侧或右侧,但我需要得到粗线的中心,因为这将在下一次计算中使用。
那么,找到所有行(每行只有一次在粗体行的中心)的正确方法是什么?
更新
试图HoughLines
也:
矢量线;
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);
}