基于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>


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了你的问题。首先,让我们来谈谈Canny边缘检测算法的基本原理。 Canny边缘检测算法是一种基于信号处理和计算机视觉的算法,它可以用来检测图像中的边缘。它的基本原理是通过对图像进行滤波,然后计算梯度值,最后对梯度值进行非极大值抑制和双阈值处理,从而得到图像中的边缘。 在OpenCV中,Canny边缘检测算法的实现可以分为以下几个步骤: 1. 首先,对图像进行高斯滤波,以去除噪声。 2. 然后,计算图像的梯度(即图像中每个像素的变化率)。这可以通过使用Sobel算子或Scharr算子来实现。 3. 接着,对梯度图像进行非极大值抑制。这个步骤的目的是,在梯度方向上找到局部最大值,并将非最大值的像素值设置为0,从而得到一个更干净的边缘图像。 4. 然后,使用双阈值处理来确定哪些像素是真正的边缘。这个步骤将像素分为三类:强边缘、弱边缘和非边缘像素。强边缘是指像素梯度值超过高阈值的像素,弱边缘是指像素梯度值介于低阈值和高阈值之间的像素,非边缘像素是指像素梯度值低于低阈值的像素。 5. 最后,使用连接算法将弱边缘连接到强边缘,从而得到最终的边缘图像。 以上就是Canny边缘检测算法的基本原理和OpenCV实现的步骤。如果你想了解更多关于行人检测的基于OpenCV的实现,可以参考以下链接:https://blog.csdn.net/qq_36667170/article/details/79478801

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值