Java中的Opencv簡介與開發(fā)環(huán)境部署方法
1.Opencv簡介
OpenCV ( Open Source Computer Vision Library )是一個廣泛應(yīng)用于計算機視覺和圖像處理領(lǐng)域的開源庫。它提供了豐富的圖像處理算法和工具,能夠處理圖像和視頻數(shù)據(jù),實現(xiàn)諸如特征提取、目標(biāo)檢測、圖像分割等功能。
OpenCV 是由 Intel 公司于 1999 年開發(fā)的開源計算機視覺庫,旨在提供一套豐富的圖像處理和計算機視覺算法。它以 C / C ++語言編寫,支持多平臺(包括 Windows 、 Linux 、 macOS 等),并提供了 Python 、 Java 等編程語言的接口,方便開發(fā)者使用。
Opencv的應(yīng)用
我們能用Opencv做什么?
OpenCV 的應(yīng)用領(lǐng)域非常廣泛,下面介紹幾個常見的應(yīng)用領(lǐng)域:
物體識別與跟蹤:
OpenCV 提供了多種方法和算法來實現(xiàn)物體的檢測和跟蹤。例如,使用 Haar 特征分類器可以進行人臉檢測,通過訓(xùn)練分類器可以實現(xiàn)自定義物體的識別;而利用光流算法可以實現(xiàn)物體在連續(xù)幀中的跟蹤。
在交通監(jiān)控系統(tǒng)中,通過 OpenCV 實現(xiàn)車輛的檢測和跟蹤,可以實現(xiàn)交通流量統(tǒng)計、違規(guī)行為監(jiān)測等功能。通過使用 OpenCV 中的背景減法和運動檢測算法,可以提取出交通場景中的前景目標(biāo)(車輛),然后利用跟蹤算法跟蹤這些目標(biāo),實現(xiàn)車輛的檢測和跟蹤。
圖像分割與邊緣檢測:
圖像分割是將圖像分成若干個區(qū)域的過程,而邊緣檢測則是尋找圖像中的邊緣信息。 OpenCV 提供了多種圖像分割和邊緣檢測算法,例如基于閾值的分割、基于邊緣檢測算子的邊緣檢測等。
在醫(yī)學(xué)圖像處理中,通過 OpenCV 實現(xiàn)腫瘤的分割和邊緣檢測,可以幫助醫(yī)生進行腫瘤的診斷和治療。通過利用 OpenCV 中的圖像分割算法,可以將醫(yī)學(xué)圖像中的腫瘤區(qū)域提取出來;而邊緣檢測算法可以用于尋找腫瘤的邊緣信息,輔助醫(yī)生進行定量分析。
圖像特征提取與描述:
圖像特征提取與描述是計算機視覺中的重要任務(wù),它可以提取圖像中的關(guān)鍵信息,用于目標(biāo)識別、圖像匹配等應(yīng)用。 OpenCV 提供了多種特征提取和描述算法,包括 Harris 角點檢測、 SIFT 、 SURF 等。
通過利用 OpenCV 中的特征點提取和匹配算法,可以將多張圖像拼接成一張全景圖像。通過提取每張圖像的特征點,然后進行特征點的匹配和變換,可以實現(xiàn)圖像的拼接和全景重建。這在旅游攝影、建筑拍攝等領(lǐng)域具有重要應(yīng)用。
2.Java使用OpenCV進行圖像操作
opencv安裝
我本地用的Opencv 4.5.1,可以到這里下載:
opencv451安裝包
到官下載Opencv:https://opencv.org/releases/
下載windows的exe包,雙擊安裝即可
java項目中集成Opencv
這里使用的是IDEA進行Opencv集成,主要是需要把Opencv的jar包引入項目的依賴庫,并且設(shè)置Opencv的運行環(huán)境。
使用快捷鍵 Ctrl+Shift+Alt+S打開項目設(shè)置:
導(dǎo)入Opencv的jar包到項目中,jar包在安裝目錄的build/java目錄下:
同時需要配置opencv的運行環(huán)境,需要將 安裝目錄/build/java/x64/opencv_java451.dll文件,復(fù)制到j(luò)ava運行環(huán)境jre的bin目錄下:
如果不進行運行環(huán)境設(shè)置的話,會報以下錯誤:
測試是否成功:
在java項目中,新建Demo類:
public class Demo { // 調(diào)用OpenCV庫文件 static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String args[]) { Mat img = Imgcodecs.imread("D://test.png") } }
如果能正常運行無報錯,則說明已經(jīng)安裝成功了(注意圖片路徑在本地要有哦)
3.Opencv常用的API
讀取與輸出圖像
在OpenCV中,圖象輸入與輸出使用imread()、imwrite()兩個方法
Mat mat1 = Imgcodecs.imread("D://test.png"); //讀取磁盤的圖片 boolean imwrite = Imgcodecs.imwrite("D://test2.png", mat); //寫出磁盤的圖片
下面是讀取和寫出的案例
public class Demo { public static void main(String args[]) { // 加載本地OpenCV庫 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat mat = Imgcodecs.imread("D://test.png"); boolean imwrite = Imgcodecs.imwrite("D://test2.png", mat); } }
顯示圖像
可以通過GUI的方式顯示圖片,不需要再將圖像通過流輸出到本地再來查看。
Mat mat = Imgcodecs.imread("D://test.png"); //顯示圖像 HighGui.imshow("原圖", mat); //延時多長時間后顯示 HighGui.waitKey(0);
圖像壓縮和解壓縮
OpenCV中的imencode方法和imdecode方法是用于圖像壓縮和解壓縮的函數(shù)。
壓縮:
將一張Mat對象壓縮并保存為JPEG格式的文件
public static void main(String args[]) throws IOException { Mat mat = Imgcodecs.imread("D://test.png"); MatOfByte matOfByte = new MatOfByte(); Imgcodecs.imencode(".png", mat, matOfByte); # Imgcodecs.imencode(".jpg", mat, matOfByte , new MatOfInt(Imgcodecs.IMWRITE_JPEG_QUALITY, 80)); Files.write(Paths.get("D://write.png"), matOfByte.toArray()); }
方法說明
//ext表示編碼后的文件類型(例如".jpg"、".png"等) //img表示需要編碼的圖像 //buf表示存儲編碼結(jié)果的字節(jié)流 //params為可選參數(shù),表示編碼參數(shù)(例如JPEG的壓縮質(zhì)量) imencode(String ext, Mat img, MatOfByte buf, MatOfInt params);
解壓縮
//buf為需要解碼的圖像數(shù)據(jù)流 //flags為解碼標(biāo)志,通常使用IMREAD_COLOR表示將圖像解碼為彩色圖像。 imdecode(Mat buf, int flags)
當(dāng)已經(jīng)有了一個編碼后的JPEG格式圖像數(shù)據(jù)流,可以使用以下代碼將其解碼為OpenCV格式的圖像:
byte[] bytes = Files.readAllBytes(Paths.get("D://write.jpg")); Mat matImage = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.IMREAD_COLOR);
到此這篇關(guān)于Java中的Opencv簡介與開發(fā)環(huán)境部署方法的文章就介紹到這了,更多相關(guān)java opencv開發(fā)環(huán)境部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Bean生命周期之Bean元信息的配置與解析階段詳解
這篇文章主要為大家詳細介紹了Spring Bean生命周期之Bean元信息的配置與解析階段,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03MyBatis傳入?yún)?shù)為List對象的實現(xiàn)
這篇文章主要介紹了MyBatis傳入?yún)?shù)為List對象的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03java volatile關(guān)鍵字作用及使用場景詳解
在本文里我們給大家分享的是關(guān)于java volatile關(guān)鍵字作用及使用場景的相關(guān)知識點內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-08-08SpringBoot integration實現(xiàn)分布式鎖的示例詳解
常規(guī)項目都是采用Redission來實現(xiàn)分布式鎖,進行分布式系統(tǒng)中資源競爭加鎖操作,偶然發(fā)現(xiàn)SpringBoot中的integration也實現(xiàn)多種載體的分布式鎖控制,下面我們就來看看具體實現(xiàn)方法吧2023-12-12基于springboot創(chuàng)建mybatis的完整步驟
MyBatis是一款優(yōu)秀的數(shù)據(jù)庫持久層框架,相比Hibernate我更喜歡使用MyBatis,看的到SQL還是讓人更安心點,這篇文章主要給大家介紹了關(guān)于基于springboot創(chuàng)建mybatis的完整步驟,需要的朋友可以參考下2024-03-03windows系統(tǒng)使用mvn命令打包并指定jdk路徑方式
這篇文章主要介紹了windows系統(tǒng)使用mvn命令打包并指定jdk路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04