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);
}
}