我有教程中的代码,我想检测图像中的直线。 我有这个代码,但对于1行HoughLinesP生成数百个点而不是2个点(起点和终点 - [x1,y1]和[x2,y2])。 即使我使用空图像,我得到99分...... 非常感谢你们。
Mat src = Highgui.imread("C:/Users/Daniel/Desktop/line.png",Highgui.CV_LOAD_IMAGE_COLOR);
Mat lines = new Mat();
Mat grey = new Mat();
Imgproc.cvtColor(m, grey, Imgproc.COLOR_BGR2GRAY);
Imgproc.HoughLinesP(grey, lines, 1, Math.PI / 180, 50, 50, 10);
for (int x = 0; x < lines.cols(); x++)
{
double[] vec = lines.get(0, x);
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
Core.line(grey, start, end, new Scalar(100,100,100), 1);
}
//just show image
new LoadImage("C:/Users/Daniel/Desktop/cdst.jpg",cdst);
//print matrix of points of all lines - here I get a lot of points for 1 line
System.out.println(lines.dump());
答案 0 :(得分:1)
虽然您没有放置示例图像而没有完全描述问题,但我会尝试回答它,因为我知道问题可能是什么(当然,在我的问题中有详细信息之前我无法确定)。< / p>
HoughLinesP
期望二进制图像(可能是边缘检测算法的输出),其中线以白色(或二进制图像中的1)表示,背景以黑色(或0)表示。问题是你的图像可能具有相反的表示,这使得函数提供了太多的输出行。你想要的是这样的:
这是使用HoughLinesP
来获取行方程的C ++代码。
#include <iostream>
#include <cv.h>
#include <highgui.h>
int main()
{
cv::Mat inImage = cv::imread("savedPng.png");
cv::Mat ginImage;
cv::cvtColor(inImage, ginImage, CV_BGR2GRAY);
cv::vector<cv::Vec4i> lines;
cv::HoughLinesP(ginImage, lines, 1, CV_PI/180, 50, 50, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
cv::Vec4i l = lines[i];
std::cout << "( " << l[0]<< ", " << l[1]<< std::endl;
std::cout << "( " << l[2]<< ", " << l[3] << std::endl;
std::cout << "***********"<< std::endl;
}
return 1;
}
这是输出:
( 103, 294
( 600, 41
***********
( 105, 294
( 601, 42
***********
( 102, 294
( 600, 40
***********
( 112, 292
( 601, 43
***********
( 105, 291
( 416, 133
***********
( 445, 123
( 601, 44
***********