基於java(加eclipse)的OpenCV學習之二____圖像加載、灰度圖、開運算、畫線、Canny檢測


前言:

    圖像的一些簡單操作,例如求灰度圖、轉hsv模型、腐蝕膨脹(開運算)、Canny檢測等等。其實就是使用OpenCV的已有庫函數來實現,代碼當中調用函數就行了。

Java上的調用和C++的還是有區別的。


首先得要準備一個opencv Java的api文檔,下載地址:http://download.csdn.net/detail/theblackbeard/9669419


注意點:

1、java使用opencv的庫,其實幾乎都是以靜態方法的形式提供,比如灰度圖、Canny邊緣檢測、膨脹、腐蝕等等,這都被封裝起來,以靜態方法提供給java使用,所以有時候在看關於C++的opencv的書時,上面所使用的函數,拿到java上來使用,得要清楚那個函數在java的api的那個包裏面,目前一般對圖像直接處理的函數都在org.opencv.imgproc這個包裏面的Imgproc類裏面提供。

2、圖像載入

<span style="font-size:14px;">Mat srcImage = Imgcodecs.imread(getClass().getResource("dzjym01.png").getPath().substring(1));</span>
這個圖像的存放路徑要放到代碼的目錄下面,eclipse的結構如下:


還有一種加載方式:

<span style="font-size:14px;">Mat src = Imgcodecs.imread("e:\\grey.PNG");</span>
這樣的話好理解,就是指定路徑加載,輸出圖片也一樣,可以用方式一,也可以使用這種指定路徑的方式;使用方式一的話就是輸出到src的同級目錄下,在源代碼的包的上級目錄。


下面有一個示例代碼,註釋都很清楚,可以自己拿一張圖片做實驗,看看前後對比。


<span style="font-size:14px;">package cn.zhoucy;

import java.util.ArrayList;
import java.util.List;

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

public class Test01 {
	
	public Test01() {
		/*調用opencv的庫之前,得要有下面的代碼來加載**/
		System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
	}
	
	//做開運算
	public void runErode() {   
				
		
		//載入原圖
		Mat srcImage = Imgcodecs.imread(getClass().getResource("dzjym01.png").getPath().substring(1));
		
		//進行腐蝕
		//1、建立腐蝕模板
		Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, (new Size(15,5)));
		//2、建立輸出圖像對象
		Mat dstImage = new Mat();
		//3、進行腐蝕
		Imgproc.erode(srcImage, dstImage, element);//腐蝕
		Imgproc.dilate(dstImage, dstImage, element);//膨脹
		System.out.println(Imgcodecs.imwrite("blackto.jpg",dstImage));
		
	}
	
	//進行Canny邊緣檢測
	public void runCanny() {
		
		//載入原圖
		Mat srcImage = Imgcodecs.imread(getClass().getResource("black.jpg").getPath().substring(1));
		
		
		//參數定義
		Mat dstImage = new Mat();
		Mat edge = new Mat();
		Mat grayImage = new Mat();
		
		dstImage.create(srcImage.size(), srcImage.type());
		
		//將原圖轉化成灰度圖
		Imgproc.cvtColor(srcImage, grayImage, Imgproc.COLOR_BGR2GRAY);
		
		//使用3x3內核來降噪
		Imgproc.blur(grayImage, edge, new Size(3,3));
		
		//運行Canny算子
		Imgproc.Canny(edge, edge, 3, 9, 3,false);
		
		System.out.println(Imgcodecs.imwrite("blackto.jpg",edge));
		
	}
	
	//畫橢圓
	public void runEllipse() {
		
		int angle = 0;
		//載入原圖
		Mat srcImage = Imgcodecs.imread(getClass().getResource("dzjym01.png")
				.getPath().substring(1));
		Imgproc.ellipse(srcImage, new Point(600/2,600/2), 
				new Size(600/4,600/16), angle, 0, 360, new Scalar(255, 129, 0), -1);
		System.out.println(Imgcodecs.imwrite("blackto.jpg",srcImage));
		
	}
	
	//畫線
	public void runLine() {
		
		//載入原圖
		Mat srcImage = Imgcodecs.imread(getClass().getResource("dzjym01.png")
				.getPath().substring(1));
		int width = srcImage.width();
		int height = srcImage.height();
		for(int j=0;j<4;j++) {
			Imgproc.line(srcImage, new Point(0, (height/4)*(j+1)), 
					new Point(width, (height/4)*(j+1)), new Scalar(255, 129, 0), 2);
			Imgproc.line(srcImage, new Point((width/4)*(j+1), 0), 
					new Point(( width/4)*(j+1), height), new Scalar(255, 129, 0), 2);
		}
		
		System.out.println(Imgcodecs.imwrite("blackto.jpg",srcImage));
	}
	
	//轉到HSV模型
	public void runChange() {
		
		
		Mat srcImage = Imgcodecs.imread(getClass().getResource("dzjym01.png")
				.getPath().substring(1));
		Mat dstImage = new Mat();
		Imgproc.cvtColor(srcImage, dstImage, Imgproc.COLOR_RGB2HSV);//轉成HSV模型
			
		System.out.println(Imgcodecs.imwrite("blackto.jpg",dstImage));
		
	}
		

	public static void main(String[] args) {

		Test01 t = new Test01();
		
		//t.runErode();
		//t.runLine();
		
	}
	
		
}
</span>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章