【发布时间】:2015-07-30 17:47:08
【问题描述】:
我正在使用适用于 Android 的 OpenCV 3.0。我有一张图像,我想在其中检测圆形表盘内的手的角度。为此,我正在使用HoughLinesP 来检测手部。
这是代码。
Mat imgSource = new Mat(), imgCirclesOut = new Mat(),imgLinesOut=new Mat();
//grey opencv
Imgproc.cvtColor(Image, imgSource, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur( imgSource, imgSource, new Size(9, 9), 2, 2 );
int threshold = 0;
int minLineSize = 0;
int lineGap = 0;
Imgproc.HoughLinesP(imgSource, imgLinesOut, 1, Math.PI/180, threshold, minLineSize, lineGap);
for( int j = 0; i < imgLinesOut.cols(); i++ )
{
double[] vec=imgLinesOut.get(0,j);
Point pt1, pt2;
pt1=new Point(vec[0],vec[1]);
pt2=new Point(vec[2],vec[3]);
Imgproc.line( Image, pt1, pt2, new Scalar(0,0,255), 3, Core.LINE_AA,0);
}
我需要的是这些圆圈中手的角度。非常感谢有关此问题的任何帮助。提前致谢
编辑 我已经用这个更新了我的代码
Mat imgSource = new Mat(), imgCirclesOut = new Mat(),imgLinesOut=new Mat();
Imgproc.GaussianBlur( Image, imgSource, new Size(5, 5), 2, 2 );
int threshold = 20;
int minLineSize = 0;
int lineGap = 10;
Imgproc.Canny(imgSource, imgSource, 70, 100);
Imgproc.HoughLinesP(imgSource, imgLinesOut, 1, Math.PI/180, threshold, minLineSize, lineGap);
for( int j = 0; j < imgLinesOut.cols(); j++ )
{
double[] vec=imgLinesOut.get(0,j);
Point pt1, pt2;
pt1=new Point(vec[0],vec[1]);
pt2=new Point(vec[2],vec[3]);
Imgproc.line( imgSource, pt1, pt2, new Scalar(0,0,255), 3, Core.LINE_AA,0);
}
正如@Micka 所建议的,不需要灰度图像(我删除了cvtcolor)。我还将GuassianBlur Size 的值减小到5。我也在图像上添加了 Canny 作为边缘。
生成的模糊图像是
【问题讨论】:
-
你试过
Math.PI/1800吗? -
@Micka
math.PI/1800将行从最后一圈移到第二圈... -
你的问题可能是这一行:
for( int j = 0; i < imgLinesOut.cols(); i++ )应该改为for( int j = 0; j < imgLinesOut.cols(); j++ ) -
感谢@Micka 指出这个愚蠢的错误,但这并没有解决问题。蓝线现在在第四圈...
-
您不应该向函数提供灰度图像,而是提供二进制边缘图像(边缘 = 白色,非边缘 = 黑色)。请尝试计算
canny并将结果作为输入发送到 HoughLinesP。如果您的图像是真实尺寸,那么尺寸为 9 的高斯模糊似乎也有点太大了。您可以将模糊图像添加到您的帖子中吗?计算canny时,也请发布canny图片。