4

OpenCV Java入门三 Mat的基本操作

 2 years ago
source link: https://blog.csdn.net/lifetragedy/article/details/123708839
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

环境好了,我们就可以进入正文了。

在之前入门一、二中分别已经有画图的两个例子了。但没有细节展开我们的代码和OpenCV到底在干什么。

使用OpenCV时你需要补充的知识

你需要熟练使用Java Swing,或者是其它任何一门语言中关于GUI方面的编程。

我们这用的是OpenCV Java,因此对于Java Swing必须熟练。你可以安装eclipse 中的windowbuilder来帮助你做Swing的编程。

至于Java Swing中的界面、Frame、Panel、Button以及Layout,这块在“JDK核心技术卷1、卷2”中已有详细描述,我就不多此一举了。

Mat对象

OpenCV用来存储图像,很多时候都会用到这个Mat方法。数字图像可看做一个数值矩阵, 其中的每一个元素表明一个像素点。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;  //

具体不作进一步展开,但我们要会使用这个Mat。

因此今天以Mat来做几个小练习。

Mat划线

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEdJVENJQw==,size_20,color_FFFFFF,t_70,g_se,x_16

记得OpenCV上手都有一句“System.loadLibrary(Core.NATIVE_LIBRARY_NAME);”,是因为OpenCV Java虽然使用的是“opencv-343.jar”,实际它会去调用“opencv_java343.dll”,并且opencv_java343.dll有依赖,它会去找它自己在Windows的控制面板->系统变量->path中的依赖的那些opencv编译出来的包。

我不喜欢把opencv_java343.dll所依赖的这些DLL放到windows的安装目录的System32目录下。

因为你把这些dll放在system32目录下,和你直接在System的path下加入这些dll效果是一样的。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEdJVENJQw==,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEdJVENJQw==,size_20,color_FFFFFF,t_70,g_se,x_16

 

HighGui是一个OpenCV自带的“内嵌面板”。

有时我也会自己写JFrame来做“展示”。如下面这个例子。

Mat在己有图片上加圆圈

ImageShowAddCircle.java

 ImageViewer.java

它显示的效果如下:

它会在一个图片上(未加圆圈前)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEdJVENJQw==,size_20,color_FFFFFF,t_70,g_se,x_16

 显示带两个圆圈的画(加了圆圈后)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEdJVENJQw==,size_20,color_FFFFFF,t_70,g_se,x_16

 Mat与Image互转

由于我们经常使用Swing组件,Swing中有一个imageView.setIcon方法或者是setImage方法,它要求的是输入一个java.awt.Image对象。

那么Mat和Image经常会互转,因此我们有一套互转的小工具类如下:

OpenCVUtil.java

Mat使用blur图片

它把一张原来的未blur处理的图片,变成了如下这样

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVEdJVENJQw==,size_20,color_FFFFFF,t_70,g_se,x_16

 结束今天的博客,下一篇会讲“认脸”。认脸和识脸是两个课题,我们一步步来。目前网上99%的教程只能到达认脸这一步,即这是一个脸。但不代表这是谁?这是谁就叫“识脸”。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK