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