OpenCV Java 图像线段检查与绘制

package com.opencv;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCvMain {
	
	//静态代码块加载动态链接库
	static {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}

	public static void main(String[] args) {
		
		/*
		 * IMREAD_UNCHANGED = -1 :不进行转化,比如保存为了16位的图片,读取出来仍然为16位。
		 * IMREAD_GRAYSCALE = 0 :进行转化为灰度图,比如保存为了16位的图片,读取出来为8位,类型为CV_8UC1。
		 * IMREAD_COLOR = 1 :进行转化为三通道图像。
		 * IMREAD_ANYDEPTH = 2 :如果图像深度为16位则读出为16位,32位则读出为32位,其余的转化为8位。
		 * IMREAD_ANYCOLOR = 4 :图像以任何可能的颜色格式读取
		 * IMREAD_LOAD_GDAL = 8 :使用GDAL驱动读取文件,GDAL(Geospatial Data Abstraction
		 * Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。
		 *	它还有一系列命令行工具来进行数据转换和处理。
		 */
		Mat src = Imgcodecs.imread("D:\\123.jpg");
		//Imgproc.resize(src, src, new Size(src.cols()/2,src.rows()/2));
		
		HighGui.imshow("原图", src);
		HighGui.waitKey();
		
		Mat gary=new Mat();
		Mat lines=new Mat();
		
		//边缘处理 详情查看https://blog.csdn.net/ren365880/article/details/103938232
		Imgproc.Canny(src, gary, 100,200);
		
		/*
		 * 该函数实现了用于行检测的概率霍夫变换算法
		 * @param 8位单通道二进制图像。 
		 * @param lines行的输出向量。
		 * 每行由一个4元素向量((x_1,y_1,x_2,y_2))表示,其中((x_1,y_1))和((x_2,y_2))是每个检测到的线段的终点。
		 * @param rho累加器的距离分辨率,以像素为单位。
		 * @param theta 累加器的角度分辨率,以弧度为单位 直线搜索时的进步尺寸的单位角度。
		 * @param threshold累加器阈值参数。 仅返回获得足够投票((> {threshold}))的那些行。即识别某部分为图中的一条直线时它在累加平面中必须达到的值。
		 * 大于阈值threshold的线段才可以被检测通过并返回到结果中。
		 * @param minLineLength默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。。
		 * @param maxLineGap默认值0,允许将同一行点与点之间连接起来的最大的距离。
		 */
		System.out.println(Imgproc.HOUGH_GRADIENT/180.0);
		Imgproc.HoughLinesP(gary,lines, 1,0.05, 1, 0, 0);
		
		double[] date;
		for(int i=0,len=lines.rows();i<len;i++) {
			date=lines.get(i, 0).clone();
			/*
			 * 绘制连接两个点的线段。 功能线在图像中的pt1和pt2点之间绘制线段。 该线被图像边界剪裁。
			 * 对于具有整数坐标的非抗锯齿线,使用8连接或4连接的Bresenham算法。 粗线绘制为圆角。 使用高斯滤波绘制抗锯齿线。
			 * @param img图片。
			 * @param pt1线段的第一点。
			 * @param pt2线段的第二点。
			 * @param color线条颜色。
			 * @param 厚度线的宽度。
			 * @param lineType线的类型。 
			 *  FILLED = -1,
			 *  LINE_4 = 4, 下一个点和上一个点边相连(没有角了),这样就消除了8联通法线断裂的瑕疵
			 *  LINE_8 = 8, 下一个点连接上一个点的边或角
			 *  LINE_AA = 16; 边缘像素采用高斯滤波,抗锯齿
			 */
			Imgproc.line(src,new Point((int)date[0],(int)date[1]), new Point((int)date[2],(int)date[3]) ,new Scalar(0, 255, 0) , 2, Imgproc.LINE_AA);
		}
		
		HighGui.imshow("直线检测", src);
		HighGui.waitKey(0);

	}
}

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里藍天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值