最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?OpenCV學(xué)習(xí)之Mat的基本操作詳解

 更新時間:2022年03月24日 15:20:29   作者:TGITCIC  
OpenCV用來存儲圖像,很多時候都會用到這個Mat方法。數(shù)字圖像可看做一個數(shù)值矩陣,?其中的每一個元素表明一個像素點(diǎn)。Mat在?OpenCV?中表示的是?N?維稠密矩陣,與稠密矩陣相對的是稀疏矩陣。本文將重點(diǎn)介紹OpenCV中Mat的一些基本操作,需要的可以參考一下

環(huán)境好了,我們就可以進(jìn)入正文了。

在之前入門一、二中分別已經(jīng)有畫圖的兩個例子了。但沒有細(xì)節(jié)展開我們的代碼和OpenCV到底在干什么。

使用OpenCV時你需要補(bǔ)充的知識

你需要熟練使用Java Swing,或者是其它任何一門語言中關(guān)于GUI方面的編程。

我們這用的是OpenCV Java,因此對于Java Swing必須熟練。你可以安裝eclipse 中的windowbuilder來幫助你做Swing的編程。

至于Java Swing中的界面、Frame、Panel、Button以及Layout,這塊在“JDK核心技術(shù)卷1、卷2”中已有詳細(xì)描述,我就不多此一舉了。

Mat對象

OpenCV用來存儲圖像,很多時候都會用到這個Mat方法。數(shù)字圖像可看做一個數(shù)值矩陣, 其中的每一個元素表明一個像素點(diǎn)。Mat在 OpenCV 中表示的是 N 維稠密矩陣,與稠密矩陣相對的是稀疏矩陣(只存儲非零的像素值)。

Mat 類包含兩部分,一是 矩陣頭 (matrix header),二是 矩陣指針 (pointer to matrix),部分矩陣頭以下:blog

int? flags;? // signaling the contents of the matrix
int? dims;?? // dimensions
int? rows, cols;? // rows and columns
MatSize? size;? //
MatStep? step;? //

具體不作進(jìn)一步展開,但我們要會使用這個Mat。

因此今天以Mat來做幾個小練習(xí)。

Mat劃線

package org.mk.opencv;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;

public class DrawLine {

	public static void main(String[] args) {
		// 載入dll(必須先加載)
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		Mat truth = new Mat(500, 500, CvType.CV_8UC3);

		byte[] line = new byte[truth.channels() * truth.width()];

		for (int i = 0; i < line.length; i++) {
			line[i] = 125;
		}
		truth.put(250, 0, line);

		HighGui.imshow("原圖", truth);
		HighGui.waitKey(0);

	}

}

記得OpenCV上手都有一句“System.loadLibrary(Core.NATIVE_LIBRARY_NAME);”,是因?yàn)镺penCV Java雖然使用的是“opencv-343.jar”,實(shí)際它會去調(diào)用“opencv_java343.dll”,并且opencv_java343.dll有依賴,它會去找它自己在Windows的控制面板->系統(tǒng)變量->path中的依賴的那些opencv編譯出來的包。

我不喜歡把opencv_java343.dll所依賴的這些DLL放到windows的安裝目錄的System32目錄下。

因?yàn)槟惆堰@些dll放在system32目錄下,和你直接在System的path下加入這些dll效果是一樣的。

HighGui是一個OpenCV自帶的“內(nèi)嵌面板”。

有時我也會自己寫JFrame來做“展示”。如下面這個例子。

Mat在己有圖片上加圓圈

ImageShowAddCircle.java

package org.mk.opencv;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class ImageShowAddCircle {
	public static void main(String[] args) {
		// 載入dll(必須先加載)
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		// 將文件讀入為OpenCV的Mat格式。注意測試時,路徑不要包括中文
		Mat src = Imgcodecs.imread("D:\\opencv-demo\\1.jpg");
		if (src.dataAddr() == 0) {
			System.out.println("打開文件出錯");
		}
		ImageViewerAddCircle imageViewer = new ImageViewerAddCircle(src, "圖片上加圓圈");
		imageViewer.imshow();
	}
}

ImageViewer.java

package org.mk.opencv;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;

import org.mk.opencv.util.OpenCVUtil;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;

public class ImageViewerAddCircle {
	private JLabel imageView;
	private Mat image;
	private String windowName;


	public ImageViewerAddCircle(Mat image) {
		this.image = image;
	}

	/**
	 * @param image      要顯示的mat
	 * @param windowName 窗口標(biāo)題
	 */
	public ImageViewerAddCircle(Mat image, String windowName) {
		this.image = image;
		this.windowName = windowName;
	}

	/**
	 * 圖片顯示,并使用opencv的ImgProc.circle在圖片上加兩個圓圈
	 */
	public void imshow() {
		setSystemLookAndFeel();
		//在圖上畫圓
		Imgproc.circle(image, new Point(50, 50), 40, new Scalar(255, 0, 0), 2);
		//在圖上畫另一個圓
		Imgproc.circle(image, new Point(50, 100), 80, new Scalar(0, 255, 0), 5);
		//展示畫了圓的圖像
		Image loadedImage = OpenCVUtil.matToImage(image);
		JFrame frame = createJFrame(windowName, image.width(), image.height());
		imageView.setIcon(new ImageIcon(loadedImage));
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 用戶點(diǎn)擊窗口關(guān)閉
	}

	private void setSystemLookAndFeel() {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {
			e.printStackTrace();
		}
	}

	private JFrame createJFrame(String windowName, int width, int height) {
		JFrame frame = new JFrame(windowName);
		imageView = new JLabel();
		final JScrollPane imageScrollPane = new JScrollPane(imageView);
		imageScrollPane.setPreferredSize(new Dimension(width, height));
		frame.add(imageScrollPane, BorderLayout.CENTER);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		return frame;
	}
}

它顯示的效果如下:

它會在一個圖片上(未加圓圈前)

顯示帶兩個圓圈的畫(加了圓圈后)

Mat與Image互轉(zhuǎn)

由于我們經(jīng)常使用Swing組件,Swing中有一個imageView.setIcon方法或者是setImage方法,它要求的是輸入一個java.awt.Image對象。

那么Mat和Image經(jīng)常會互轉(zhuǎn),因此我們有一套互轉(zhuǎn)的小工具類如下:

OpenCVUtil.java

package org.mk.opencv.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.io.File;

import org.apache.log4j.Logger;
import org.opencv.core.CvType;
import org.opencv.core.Mat;


public class OpenCVUtil {
	private static Logger logger = Logger.getLogger(OpenCVUtil.class);

	public static Image matToImage(Mat matrix) {
		int type = BufferedImage.TYPE_BYTE_GRAY;
		if (matrix.channels() > 1) {
			type = BufferedImage.TYPE_3BYTE_BGR;
		}
		int bufferSize = matrix.channels() * matrix.cols() * matrix.rows();
		byte[] buffer = new byte[bufferSize];
		matrix.get(0, 0, buffer); // 獲取所有的像素點(diǎn)
		BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);
		final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
		System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);
		return image;
	}


	public static BufferedImage matToBufferedImage(Mat matrix) {
		int cols = matrix.cols();
		int rows = matrix.rows();
		int elemSize = (int) matrix.elemSize();
		byte[] data = new byte[cols * rows * elemSize];
		int type;
		matrix.get(0, 0, data);
		switch (matrix.channels()) {
		case 1:
			type = BufferedImage.TYPE_BYTE_GRAY;
			break;
		case 3:
			type = BufferedImage.TYPE_3BYTE_BGR;
			// bgr to rgb
			byte b;
			for (int i = 0; i < data.length; i = i + 3) {
				b = data[i];
				data[i] = data[i + 2];
				data[i + 2] = b;
			}
			break;
		default:
			return null;
		}
		BufferedImage image2 = new BufferedImage(cols, rows, type);
		image2.getRaster().setDataElements(0, 0, cols, rows, data);
		return image2;
	}

	public static Mat bufferedImageToMat(BufferedImage bi) {
		Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3);
		byte[] data = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData();
		mat.put(0, 0, data);
		return mat;
	}
}

Mat使用blur圖片

package org.mk.opencv;

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

public class Blur {
	public static void main(String[] args) {
		try {
			System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

			Mat src = Imgcodecs.imread("D:/opencv-demo/1.jpg");
			if (src.empty()) {
				throw new Exception("no file");
			}

			Mat dst = src.clone();

			Imgproc.blur(src, dst, new Size(800, 600));
			Imgcodecs.imwrite("D:/opencv-demo/blur.jpg", dst);
		} catch (Exception e) {
			System.out.println("出錯啦:" + e);
		}
	}

}

它把一張?jiān)瓉淼奈碽lur處理的圖片,變成了如下這樣

結(jié)束今天的博客,下一篇會講“認(rèn)臉”。認(rèn)臉和識臉是兩個課題,我們一步步來。目前網(wǎng)上99%的教程只能到達(dá)認(rèn)臉這一步,即這是一個臉。但不代表這是誰?這是誰就叫“識臉”。

以上就是Java OpenCV學(xué)習(xí)之Mat的基本操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Java OpenCV Mat的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java如何實(shí)現(xiàn)自定義注解

    詳解Java如何實(shí)現(xiàn)自定義注解

    注解(Annotation),也叫元數(shù)據(jù)。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。本文將通過示例詳解Java如何實(shí)現(xiàn)自定義注解,需要的可以參考一下
    2022-06-06
  • Shell重啟SpringBoot項(xiàng)目腳本的示例代碼(含服務(wù)守護(hù))

    Shell重啟SpringBoot項(xiàng)目腳本的示例代碼(含服務(wù)守護(hù))

    本文介紹了如何使用?Bash?腳本來管理和守護(hù)運(yùn)行服務(wù),將展示一個示例腳本,該腳本可以停止、啟動和守護(hù)運(yùn)行一個服務(wù),并提供了相應(yīng)的解釋和用法說明,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • SpringBoot讀取資源目錄中JSON文件的方法實(shí)例

    SpringBoot讀取資源目錄中JSON文件的方法實(shí)例

    最近做項(xiàng)目遇到需要將json類型的配置文件引用到項(xiàng)目中,已經(jīng)將讀取json文件的方法封裝成工具類,下面這篇文章主要給大家介紹了關(guān)于SpringBoot讀取資源目錄中JSON文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Spring的異常重試框架Spring Retry簡單配置操作

    Spring的異常重試框架Spring Retry簡單配置操作

    這篇文章主要介紹了Spring的異常重試框架Spring Retry簡單配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java 取出文本文件中空行的實(shí)例代碼

    java 取出文本文件中空行的實(shí)例代碼

    這篇文章介紹了java 取出文本文件中空行的實(shí)例代碼,有需要的朋友可以參考一下
    2013-09-09
  • SpringCloud微服務(wù)開發(fā)基于RocketMQ實(shí)現(xiàn)分布式事務(wù)管理詳解

    SpringCloud微服務(wù)開發(fā)基于RocketMQ實(shí)現(xiàn)分布式事務(wù)管理詳解

    分布式事務(wù)是在微服務(wù)開發(fā)中經(jīng)常會遇到的一個問題,之前的文章中我們已經(jīng)實(shí)現(xiàn)了利用Seata來實(shí)現(xiàn)強(qiáng)一致性事務(wù),其實(shí)還有一種廣為人知的方案就是利用消息隊(duì)列來實(shí)現(xiàn)分布式事務(wù),保證數(shù)據(jù)的最終一致性,也就是我們常說的柔性事務(wù)
    2022-09-09
  • Java多線程編程中使用DateFormat類

    Java多線程編程中使用DateFormat類

    這篇文章主要介紹了Java多線程編程中使用DateFormat類,文中介紹了三種相關(guān)的并發(fā)使用方法,需要的朋友可以參考下
    2015-07-07
  • 一篇文章輕松搞懂Java中的自旋鎖

    一篇文章輕松搞懂Java中的自旋鎖

    隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,越來越多的互聯(lián)網(wǎng)企業(yè)面臨著用戶量膨脹而帶來的并發(fā)安全問題。這篇文章主要給大家介紹了關(guān)于Java中自旋鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Spring JDBC的使用方法詳解

    Spring JDBC的使用方法詳解

    這篇文章主要介紹了Spring JDBC的使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    SpringBoot整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    本文主要介紹了SpringBoot整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

彭州市| 沅江市| 北宁市| 宜兴市| 长春市| 太保市| 定襄县| 新郑市| 渑池县| 伽师县| 贵阳市| 通化市| 东山县| 合水县| 界首市| 时尚| 丁青县| 海兴县| 灌云县| 远安县| 陵川县| 徐州市| 长丰县| 苍溪县| 电白县| 来凤县| 堆龙德庆县| 图木舒克市| 浪卡子县| 城口县| 衡东县| 喜德县| 武陟县| 鹰潭市| 宜章县| 和硕县| 正阳县| 武威市| 麻江县| 苏尼特左旗| 玉龙|