欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java調(diào)用opencv實(shí)現(xiàn)圖片矯正功能

 更新時(shí)間:2023年09月04日 11:11:46   作者:冒泡的肥皂  
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用opencv實(shí)現(xiàn)圖片矯正功能,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1.通過(guò)霍夫線(xiàn)矯正土圖片

public static void getCorrect1(Mat image) {
Mat clone=image.clone();
Mat src=image.clone();
int width = image.width();
int height = image.height();
int pointCount = width * height;
Mat points=image.reshape(3, pointCount);
points.convertTo(points,  CvType.CV_32F);
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);
//一般來(lái)說(shuō),高閾值maxVal推薦是低閾值minVal的2~3倍
int lowThresh=20;
//邊緣檢測(cè)
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 霍夫線(xiàn)變換檢測(cè)到線(xiàn)條的輸出矢量,由(ρ,θ)表示
	 * rho   以像素為單位的距離精度(直線(xiàn)搜索時(shí)的進(jìn)步尺寸的單位半徑)
	 * theta 以弧度為單位的角度精度(直線(xiàn)搜索時(shí)的進(jìn)步尺寸的角度單位)
	 * threshold 累加平面的閾值參數(shù)(直線(xiàn)被識(shí)別時(shí)它在累加平面中必須達(dá)到的值)
	 * srn    對(duì)于多尺度霍夫變換,這是第三個(gè)參數(shù)進(jìn)步尺寸的除數(shù)距離。
?       *        粗略累加器進(jìn)步尺寸直接是rho,精確的累加器進(jìn)步尺寸為rho/srn
	 * min_theta 檢測(cè)到的直線(xiàn)的最小角度
	 * max_theta 測(cè)到的直線(xiàn)的最大角度
	 */
double sum = 0;
double angle=0;
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));
	sum += theta;
	Imgproc.line(clone, pt1, pt2, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
}
HighGui.imshow("houghLines", clone);
double average = sum / storage.rows(); //對(duì)所有角度求平均,這樣做旋轉(zhuǎn)效果會(huì)更好
angle = average/ Math.PI * 180 - 90;
System.out.println("average:"+angle);
Point center=new Point();
center.x=image.cols()/2;
center.y=image.rows()/2;
// 得到旋轉(zhuǎn)矩陣算子
Mat matrix = Imgproc.getRotationMatrix2D(center, angle, 1);
Imgproc.warpAffine(src, src, matrix,src.size(), 1, 0, new Scalar(0, 0, 0));
HighGui.imshow("rotation", src);
}

2.通過(guò)輪廓檢測(cè)矯正土圖片

public static Mat getCorrect2(Mat image) {
Mat clone=image.clone();
Mat src=image.clone();
int width = image.width();
int height = image.height();
int pointCount = width * height;
Mat points=image.reshape(3, pointCount);
points.convertTo(points,  CvType.CV_32F);
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);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
// 尋找輪廓
Imgproc.findContours(clone, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE,
        new Point(0, 0));
// 找出匹配到的最大輪廓
double area = Imgproc.boundingRect(contours.get(0)).area();
int index = 0;
// 找出匹配到的最大輪廓
for (int i = 0; i < contours.size(); i++) {
    double tempArea = Imgproc.boundingRect(contours.get(i)).area();
    if (tempArea > area) {
        area = tempArea;
        index = i;
    }
}
MatOfPoint2f matOfPoint2f = new MatOfPoint2f(contours.get(index).toArray());
RotatedRect rect = Imgproc.minAreaRect(matOfPoint2f);
 // 獲取矩形的四個(gè)頂點(diǎn)
Point[] rectpoint = new Point[4];
rect.points(rectpoint);
double line1 = Math.sqrt((rectpoint[1].y - rectpoint[0].y)*(rectpoint[1].y - rectpoint[0].y) + (rectpoint[1].x - rectpoint[0].x)*(rectpoint[1].x - rectpoint[0].x));
double line2 = Math.sqrt((rectpoint[3].y - rectpoint[0].y)*(rectpoint[3].y - rectpoint[0].y) + (rectpoint[3].x - rectpoint[0].x)*(rectpoint[3].x - rectpoint[0].x));
double angle = rect.angle;
if (line1 > line2) 
{
	angle = 90 + angle;
}
Point center = rect.center;
Mat CorrectImg = new Mat(clone.size(), clone.type());
clone.copyTo(CorrectImg);
// 得到旋轉(zhuǎn)矩陣算子
Mat matrix = Imgproc.getRotationMatrix2D(center, angle, 0.8);
Imgproc.warpAffine(src, src, matrix, CorrectImg.size(), 1, 0, new Scalar(0, 0, 0));
HighGui.imshow("rotation", src);
return src;
}

3.兩個(gè)算法的應(yīng)用場(chǎng)景

基于輪廓提取的矯正算法更適用于車(chē)牌、身份證、人民幣、書(shū)本、發(fā)票一類(lèi)矩形形狀而且邊界明顯的物體矯正。

基于直線(xiàn)探測(cè)的矯正算法更適用于文本類(lèi)的矯正。

到此這篇關(guān)于Java調(diào)用opencv實(shí)現(xiàn)圖片矯正功能的文章就介紹到這了,更多相關(guān)Java opencv圖片矯正內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot整合Activiti操作詳解

    Springboot整合Activiti操作詳解

    這篇文章主要給大家詳細(xì)介紹了Springboot整合Activiti的操作流程,文中流程步驟和代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot靜態(tài)資源映射,圖片無(wú)法實(shí)時(shí)訪問(wèn)問(wèn)題及解決

    SpringBoot靜態(tài)資源映射,圖片無(wú)法實(shí)時(shí)訪問(wèn)問(wèn)題及解決

    文章介紹了Spring Boot中靜態(tài)資源映射配置,解決了圖片上傳后無(wú)法實(shí)時(shí)訪問(wèn)的問(wèn)題,通過(guò)配置虛擬路徑,將訪問(wèn)路徑映射到指定的物理路徑,解決了圖片無(wú)法實(shí)時(shí)顯示的問(wèn)題
    2025-02-02
  • SpringBoot實(shí)現(xiàn)獲取客戶(hù)端IP地理位置

    SpringBoot實(shí)現(xiàn)獲取客戶(hù)端IP地理位置

    在當(dāng)今互聯(lián)的世界中,了解客戶(hù)端的地理位置對(duì)于提供個(gè)性化服務(wù)和增強(qiáng)用戶(hù)體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶(hù)端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下
    2023-11-11
  • 教你使用Java獲取當(dāng)前時(shí)間戳的詳細(xì)代碼

    教你使用Java獲取當(dāng)前時(shí)間戳的詳細(xì)代碼

    這篇文章主要介紹了如何使用Java獲取當(dāng)前時(shí)間戳,通過(guò)兩個(gè)java示例,向大家展示如何獲取java中的當(dāng)前時(shí)間戳,文本通過(guò)示例代碼給大家展示了java獲取當(dāng)前時(shí)間戳的方法,需要的朋友可以參考下
    2022-01-01
  • Java可視化之實(shí)現(xiàn)文本的加密和解密

    Java可視化之實(shí)現(xiàn)文本的加密和解密

    這篇文章主要介紹了Java可視化之實(shí)現(xiàn)文本的加密和解密,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java實(shí)現(xiàn)批量下載選中文件功能

    Java實(shí)現(xiàn)批量下載選中文件功能

    這篇文章主要介紹了Java實(shí)現(xiàn)批量下載選中文件功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • 快速上手Mybatis-plus結(jié)構(gòu)構(gòu)建過(guò)程

    快速上手Mybatis-plus結(jié)構(gòu)構(gòu)建過(guò)程

    這篇文章主要介紹了快速上手Mybatis-plus結(jié)構(gòu)構(gòu)建過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Mybatis實(shí)現(xiàn)自定義的typehandler三步曲

    Mybatis實(shí)現(xiàn)自定義的typehandler三步曲

    這篇文章主要介紹了Mybatis實(shí)現(xiàn)自定義的typehandler三步曲的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • SpringBoot中的Spring Cloud Hystrix原理和用法詳解

    SpringBoot中的Spring Cloud Hystrix原理和用法詳解

    在Spring Cloud中,Hystrix是一個(gè)非常重要的組件,Hystrix可以幫助我們構(gòu)建具有韌性的分布式系統(tǒng),保證系統(tǒng)的可用性和穩(wěn)定性,在本文中,我們將介紹SpringBoot中的Hystrix,包括其原理和如何使用,需要的朋友可以參考下
    2023-07-07
  • Spring Boot Thymeleaf實(shí)現(xiàn)國(guó)際化的方法詳解

    Spring Boot Thymeleaf實(shí)現(xiàn)國(guó)際化的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot Thymeleaf實(shí)現(xiàn)國(guó)際化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論