[英]Why different result of HoughLines of opencv in java and c++
我是Opencv的新手,我正在閱讀DanielLélisBaggio所着的名為OpenCV 3.0 Computer Vision with Java的書。 我從opencv網站測試一個試圖檢測線條的圖像但是我得到了不同的結果,只有一行檢測到DanielLélisBaggiojava代碼。 我不知道為什么這段代碼不能正常工作。 書中的守則:
else if(houghString.equals(operation)){
Mat canny = new Mat();
Imgproc.Canny(originalImage, canny,10 , 50, aperture, false);
image = originalImage.clone();
Mat lines = new Mat();
Imgproc.HoughLines(canny, lines, 1, Math.PI/180, lowThreshold);
for( int i = 0; i < lines.cols(); i++ )
{
double rho = lines.get(0, i)[0];
double theta = lines.get(0, i)[1];
Point pt1 = new Point(), pt2= new Point();
double a = Math.cos(theta), b = Math.sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = Math.round(x0 + 1000*(-b));
pt1.y = Math.round(y0 + 1000*(a));
pt2.x = Math.round(x0 - 1000*(-b));
pt2.y = Math.round(y0 - 1000*(a));
Imgproc.line( image, pt1, pt2, new Scalar(255,0,0), 2, Core.LINE_AA,0);
}
}
else if(pHoughString.equals(operation)){
Mat canny = new Mat();
Imgproc.Canny(originalImage, canny,10 , 50, aperture, false);
//canny = originalImage.clone();
image = originalImage.clone();
//Imgproc.cvtColor(image, image, Imgproc.COLOR_GRAY2BGR);
Mat lines = new Mat();
Imgproc.HoughLinesP(canny, lines, 1, 360, lowThreshold, 50, 5 );
for( int i = 0; i < lines.cols(); i++ )
{
double a = lines.get(0, i)[0];
double b = lines.get(0, i)[1];
double c = lines.get(0, i)[2];
double d = lines.get(0, i)[3];
Imgproc.line( image, new Point(a, b), new Point(c, d), new Scalar(0,0,255), 1, Core.LINE_AA,0);
}
opencv site for c ++的代碼如下:
Mat dst, cdst;
Canny(src, dst, 50, 200, 3);
cvtColor(dst, cdst, CV_GRAY2BGR);
#if 0
vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );
for( size_t i = 0; i < lines.size(); i++ )
{
float rho = lines[i][0], theta = lines[i][1];
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));
line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
}
#else
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
}
#endif
Java代碼的結果:
和opencv網站的結果:
為什么使用java和c ++的圖像有不同的結果?
現在已經晚了,但我只是打了同樣的szenario,它可能會幫助其他一些......
行以行而不是列的形式返回,因此正確的循環應該是:
for( int i = 0; i < lines.rows(); i++ ) {
double rho = lines.get(i, 0)[0];
double theta = lines.get(i, 0)[1];
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.