gpt4 book ai didi

java - HoughLinesP 不检测线条 OpenCV android

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:34 25 4
gpt4 key购买 nike

我正在使用适用于 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);
}

但结果是 enter image description here

我需要的是手在这些圆圈中的角度。非常感谢有关此问题的任何帮助。提前致谢

编辑我已经用这个更新了我的代码

 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。

生成的模糊图像是

enter image description here

最佳答案

在如此小的图像中检测线可能是个问题,因为您必须很少的点才能正确填充 Hough 累加器。

我建议使用不同的方法:

  1. 分割每个圆圈(刻度盘)
  2. 提取最大的黑色 Blob (手)

下面是这个想法的简单实现。代码是用 C++ 编写的,但您可以轻松移植到 Java,或者至少用作引用。

#include "opencv2/opencv.hpp"
using namespace cv;

int main(int, char**)
{
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

Mat3b res;
cvtColor(img, res, COLOR_GRAY2BGR);

// Find dials
vector<Vec3f> circles;
HoughCircles(img, circles, CV_HOUGH_GRADIENT, 1, img.cols/10, 400, 40);

// For each dial
for (int i = 0; i < circles.size(); ++i)
{

// Segment the dial
Mat1b dial(img.size(), uchar(255));
Mat1b mask(img.size(), uchar(0));
circle(mask, Point(circles[i][0], circles[i][1]), circles[i][2], Scalar(255), CV_FILLED);
img.copyTo(dial, mask);

// Apply threshold and open
Mat1b bin;
threshold(dial, bin, 127, 255, THRESH_BINARY_INV);
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5,5));
morphologyEx(bin, bin, MORPH_OPEN, kernel);

// Get min area rect
vector<Point> points;
findNonZero(bin, points);
RotatedRect r = minAreaRect(points);

// Draw min area rect
Point2f pts[4];
r.points(pts);
for (int j = 0; j < 4; ++j) {
line(res, pts[j], pts[(j + 1) % 4], Scalar(0, 255, 0), 1);
}
}

imshow("Result", res);
waitKey();

return 0;
}

从这张图片开始:

enter image description here

我在这里找到:

enter image description here

关于java - HoughLinesP 不检测线条 OpenCV android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com