java调用opencv霍夫线变换

简介: java调用opencv霍夫线变换

1.HoughLines



网络异常,图片无法展示
|


public static void houghLines(Mat image){
Mat clone=image.clone();
Imgproc.GaussianBlur(clone, clone, new Size(3, 3), 0, 0);
//HighGui.imshow("GaussianBlur", clone);
Imgproc.cvtColor(clone, clone,Imgproc.COLOR_BGR2GRAY);
//HighGui.imshow("GRY", clone);
//一般来说,高阈值maxVal推荐是低阈值minVal的2~3倍
int lowThresh=20;
////边缘检测
Imgproc.Canny(clone, clone,lowThresh, lowThresh*3,3);
//HighGui.imshow("Canny", clone);
Mat storage = new Mat();
/**
 * HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)
 * image 原图
 * lines 霍夫线变换检测到线条的输出矢量,由(ρ,θ)表示
 * rho   以像素为单位的距离精度(直线搜索时的进步尺寸的单位半径)
 * theta 以弧度为单位的角度精度(直线搜索时的进步尺寸的角度单位)
 * threshold 累加平面的阈值参数(直线被识别时它在累加平面中必须达到的值)
 * srn    对于多尺度霍夫变换,这是第三个参数进步尺寸的除数距离。
  *        粗略累加器进步尺寸直接是rho,精确的累加器进步尺寸为rho/srn
 * min_theta 检测到的直线的最小角度
 * max_theta 测到的直线的最大角度
*/
Imgproc.HoughLines(clone, storage, 1, Math.PI/ 180.0, 200, 0, 0);
for (int x = 0; x < storage.rows(); x++) {
  double[] vec = storage.get(x, 0);
  double rho = vec[0];
  double theta = vec[1];
  Point pt1 = new Point();
  Point pt2 = new Point();
  double a = Math.cos(theta);
  double b = Math.sin(theta);
  double x0 = a * rho;
  double 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(0, 0, 255), 1, Imgproc.LINE_4, 0);
}
HighGui.imshow("houghLines", image);
}
复制代码


2.HoughLinesP



网络异常,图片无法展示
|


public static void houghLinesP(Mat image){
Mat clone=image.clone();
Imgproc.GaussianBlur(clone, clone, new Size(3, 3), 0, 0);
//HighGui.imshow("GaussianBlur", clone);
Imgproc.cvtColor(clone, clone,Imgproc.COLOR_BGR2GRAY);
//HighGui.imshow("GRY", clone);
//一般来说,高阈值maxVal推荐是低阈值minVal的2~3倍
int lowThresh=20;
////边缘检测
Imgproc.Canny(clone, clone,lowThresh, lowThresh*3,3);
//HighGui.imshow("Canny", clone);
Mat storage = new Mat();
/**
 * HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
 * image 原图
 * lines 霍夫线变换检测到线条的输出矢量,由(ρ,θ)表示
 * rho   以像素为单位的距离精度(直线搜索时的进步尺寸的单位半径)
 * theta 以弧度为单位的角度精度(直线搜索时的进步尺寸的角度单位)
 * threshold 累加平面的阈值参数(直线被识别时它在累加平面中必须达到的值)
 * minLineLength 最低线段的长度,比它短的线段不能被显示出来。
 * maxLineGap 允许将同一行点与点之间连接起来的最大距离
 */
Imgproc.HoughLinesP(clone, storage,  1, Math.PI / 180, 50, 0, 0);
for (int x = 0; x < storage.rows(); x++)
{
    double[] vec = storage.get(x, 0);
    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);
    Imgproc.line(image, start, end, new Scalar(0, 0, 255, 255), 1, Imgproc.LINE_4, 0);
}
HighGui.imshow("HoughLinesP", image); 
}
复制代码


3.HoughCircles



网络异常,图片无法展示
|


public static void houghCircles(Mat image){
 Mat dst = image.clone();
 Imgproc.cvtColor(image, dst, Imgproc.COLOR_BGR2GRAY);
 Mat circles = new Mat();
 /**
  * HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)
  * image 原图
  * circles 检测到的圆的输出矢量,每个矢量由(x,y,radius)表示
  * method 检测方法,填HOUGH_GRADIENT即可
  * dp 用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,
              允许创建一个比输入图像分辨率低的累加器。
               若dp=2,则累加器由输入图像一半大的宽度和高度)
  * minDist 霍夫变换检测到的圆的圆心之间的最小距离
  * param1  传给canny算子的高阈值,而低阈值为高阈值的一半
  * param2 在检测阶段圆心的累加器阈值
                       越小越可以检测不存在的圆,越大检测的圆更接近完美的圆形
  * minRadius 圆半径的最小值
  * maxRadius 圆半径的最大值
  */
 Imgproc.HoughCircles(dst, circles, Imgproc.HOUGH_GRADIENT, 1, 100, 440, 50, 0, 345);
 // Imgproc.HoughCircles(dst, circles, Imgproc.HOUGH_GRADIENT, 1, 100,
 // 440, 50, 0, 0);
 for (int i = 0; i < circles.cols(); i++)
 {
     double[] vCircle = circles.get(0, i);
     Point center = new Point(vCircle[0], vCircle[1]);
     int radius = (int) Math.round(vCircle[2]);
     // circle center
     Imgproc.circle(image, center, 3, new Scalar(0, 255, 0), -1, 8, 0);
     // circle outline
     Imgproc.circle(image, center, radius, new Scalar(0, 0, 255), 3, 8, 0);
 }
HighGui.imshow("HoughCircles", image); 
}


相关文章
|
5月前
|
机器学习/深度学习 Java 开发工具
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
102 0
|
5月前
|
计算机视觉
opencv之形态变换
opencv之形态变换
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
36 0
|
6月前
|
数据采集 Java 数据挖掘
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
|
5月前
|
Java 开发工具 计算机视觉
Java使用OpenCV3.2实现视频读取与播放
Java使用OpenCV3.2实现视频读取与播放
66 0
|
6月前
|
存储 编解码 算法
【OpenCV】-霍夫变换
【OpenCV】-霍夫变换
|
6月前
|
计算机视觉 Python
轻松掌握opencv的8种图像变换
轻松掌握opencv的8种图像变换
|
6月前
|
计算机视觉
【OpenCV】-仿射变换
【OpenCV】-仿射变换
|
6月前
|
算法 计算机视觉
【OpenCV】仿射变换中cv2.estimateAffine2D 的原理
【OpenCV】仿射变换中cv2.estimateAffine2D 的原理
270 0
|
6月前
|
计算机视觉
OpenCV几何变换
OpenCV几何变换
39 0