2019-07-30 12:19:21 z634863434 阅读数 614
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4440 人正在学习 去看看 贾志刚

前言

本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961

Mat对象与IplImage对象

Mat对象是OpenCV2.0之后引进的图像数据结构,基于C++面向对象的数据结构。其在生成时,自动分配内存、不存在内存泄漏的问题。分头部和数据部分。
IplImage对象是早期用C语言风格的数据结构,需要开发者自己分配与管理内存,可能会导致内存的泄露问题。

Mat对象常用构造函数

1.Mat()
创建一个Mat对象,在构造时不进行任何操作

//创建一个Mat对象
Mat img;

2.Mat(int rows , int cols,int type)
根据用户指定的行数、列数以及类型创建一个Mat对象

//创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为1的Mat对象
Mat img= Mat(3,3,CV_8UC1);

3.Mat(Size size , int type)
根据用户指定的大小以及类型,创建一个Mat对象

//读取本地图像返回给Mat对象src,根据src的大小,创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为1的Mat对象
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC1);

4.Mat(int rows , int cols,int type,const Scalar &s)
根据用户指定的行数、列数以及类型创建一个Mat对象并初始化每个像素的值,向量长度必须对应通道数

//创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为3的Mat对象,并将初始颜色设为(127,0,255)
Mat img= Mat(3,3,CV_8UC3,Scalar(127,0,255))

5.Mat(Size size , int type , const Scalar &s)
根据用户指定的大小以及类型,创建一个Mat对象并初始化每个像素的值,向量长度必须对应通道数

//读取本地图像返回给Mat对象src,根据src的大小,创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为3的Mat对象,并将初始颜色设为(127,0,255)
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC3,Scalar(127,0,255));

6.数组构造
使用矩阵数据构造一个Mat对象

//构成3*3
// 0  -1  0
// -1  5  -1
//  0  -1  0
//的Mat图像
Mat mat = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

Mat对象常用方法

1.void copyTo(Mat mat)
Mat对象深拷贝

//将src对象的图像复制到dst对象中
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.copyTo(dst);

2.void converto(Mat dst,int type)
Mat对象转化函数

//将src转化成每个通道8个字节长度 uchar类型,通道数量为3的Mat对象(可以在函数后面附加因子进行计算)
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
str.converto(dst,CV_8UC3);

3.Mat clone()
Mat对象深拷贝

//将src对象的图像复制到dst对象中
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
dst.clone(src);

4.int channels()
获取当前图像的通道数

//获取src的通道数
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.channels();

5.int depth()
获取当前图像的深度

//获取src的深度
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.depth();

6.bool empty()
判断图像是否为空

Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.empty(); //false
dst.empty(); //true

7.uchar* ptr(i = 0)
获取当前图像的指针

//获取src图像的第一行对应指针
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
const unchar* fisrtRow = src.ptr(0);

8.Mat zeros(int rows,int cols,int type)
创建全0的Mat对象

//创建2*2每个通道8个字节长度 uchar类型,通道数量为1的全0 Mat对象
Mat img = Mat::zeros(2,2,CV_8UC1)

9.Mat eye(int rows,int cols,int type)
创建对角线为1的Mat对象

//创建2*2每个通道8个字节长度 uchar类型,通道数量为1的对象线为1 Mat对象
//1  0
//0  1
Mat img = Mat::eye(2,2,CV_8UC1)

10. _Tp& at(int row,int col)
获取图像上一个点的像素,可对其进行获取或者修改,灰度图像和RGB图像有区别

/*对于灰度图像进行像素点的获取以及修改*/
//打开原始图像
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat gray_src;
//将RGB图像转化成灰度图像
cvtColor(src,gray_src,CV_BGR2GRAY);
//获取灰度图像在 (0,0)处的像素值
uchar test = gray_src.at<uchar>(0,0);
//修改灰度图像在 (0,0)处的像素值
gray_src.at<uchar>(0,0) = 0
/*对于RGB图像进行像素点的获取以及修改*/
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
//获取RGB像素
uchar blue= src.at<Vec3b>(0,0)[0];  //蓝色通道像素值
uchar green= src.at<Vec3b>(0,0)[1];  //绿色通道像素值
uchar red = src.at<Vec3b>(0,0)[2];  //红色通道像素值
//修改RGB像素
src.at<Vec3b>(0,0)[0] = 0; //修改蓝色通道像素为0
src.at<Vec3b>(0,0)[1] = 0; //修改绿色通道像素为0
src.at<Vec3b>(0,0)[2] = 0; //修改红色通道像素为0
2018-11-25 19:25:37 OAOOwOOAO 阅读数 988
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4440 人正在学习 去看看 贾志刚

数字图像处理技术

所谓数字图像处理,是指利用计算机对图像进行分析、加工、和处理,使其满足视觉、心理或其他要求的技术,主要有去除噪声、增强、复原、分割、提取特征等处理的方法。20 世纪 50 年代,电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息,这便是早期的图像处理。早期图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。数字图像处理作为一门学科大约形成于 20 世纪 60 年代初期。

简介

图像处理中,一般输入的是质量低的图像,而输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。进行数字图像处理所需要的设备包括摄像机、数字图像采集器(包括同步控制器、模数转换器及帧存储器)、图像处理计算机和图像显示终端。主要的处理任务,通过图像处理软件来完成。为了对图像进行实时处理,需要非常高的计算速度,通用计算机无法满足,需要专用的图像处理系统。这种系统由许多单处理器组成阵列式处理机,并行操作,以提高处理的实时性。

方法

1) 几何变换
主要指放大、缩小、旋转等操作,不需要复杂的计算机和软件,是对图像的最基本的处理。
2) 颜色处理
主要包括颜色空间的转化、亮度以及对比度的调节、颜色修正等。目前主流的颜色模式有:RGB模式、CMYK模式、HSB模式、Lab颜色模式、位图模式、灰度模式、索引颜色模式、双色调模式和多通道模式。其中RGB模式的应用最为广泛,电视机和计算机的监视器都是基于RGB颜色模式来创建其颜色的,一共可以产生1677万余种颜色,通过计算机对RGB参数的调整便可以实现基本的颜色处理。
3) 图像融合
主要指将多源信道所采集到的关于同一目标的图像数据经过图像处理和计算机技术等,最大限度的提取各自信道中的有利信息,最后综合成高质量的图像,以提高图像信息的利用率、改善计算机解译精度和可靠性、提升原始图像的空间分辨率和光谱分辨率,利于监测。
4) 降噪
主要指各种针对二维图像的去噪滤波器或者信号处理技术。计算机通过对图像整体的分析。在已有的灰度图像和全彩色图像的领域空间处理技术上,我们可以研究RGB图像的颜色分量图像分析噪声源,通过分析HSI图像的各个分量,得到图片的有关信息,并将这些信息交由已经给定的程序处理,得到更加完整,信息更大的图像。通过这项技术,在对图像进行二次加工后,可以使得原本不清晰的图像在处理后更加清晰,理解更多的信息。在图像的传输储存中,难免会遇到数据的丢失,因此使用这项技术,可以尽可能的使图像的信息完美的保存下来。对于那些需要数据实时传输的地方,运用这项技术可以做到对画面几乎无损耗的传输,方便人们对于画面的理解,
5) 图像增强
主要指增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合。图像处理中基于空域的算法处理时直接对图像灰度级做运算,基于频域的算法是在图像的某种变换域内对图像的变换系数值进行某种修正,是一种间接增强的算法。

应用

1) 人脸识别
一般来说,人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别(身份确认或者身份查找)。系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
2) 印刷
印刷是指将影像或文字原稿迅速大量复制的一种技术,目前还包括了立体印刷,三维打印等新兴技术。目前,印刷进入了电子控制和自动化的时期,电子排版、电子分色、电子雕版广泛应用,在印刷质量和效率上都得到了巨大提高。
3) 卫星图像处理
主要指用计算机对遥感图像进行分析,以达到所需结果的技术。根据卫星传送回地球的图像对地球的变化进行信息的储存和整理,能够体现出地球的实时变化,也就是可以保证数字地图的精确性和及时性。应用最为广泛的卫星处理方式就是利用 GIS系统建立起了地图信息总数据库。而绘制出来的数字地图被广泛应用于社会中各种行业。
4) 其他
日常生活中,数字图像处理技术的应用还体现在汽车障碍识别、显微图像处理、特征识别、摄影摄像、医学图像处理等领域。

总结

随着计算机技术的发展,数字图像处理技术已经深入到我们生活中的方方面面。在上述二维图像处理之外,还存在多维图像处理,如医学中对病人心脏的诊断便包含了四维图像的分析技术,他们本身也有更多的新概念,如连通性、旋转不变性等。数字图像处理技术的发展还在继续进行中。

By:熊伟汐 2018/11/24

2020-01-13 12:20:27 m0_37482190 阅读数 94
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4440 人正在学习 去看看 贾志刚

1. 图像概念: 是对客观对象的一种相似性的,生动性的描述或写真。是对客观对象的表示, 包含了被描述对象的有关信息,是人类最主要的信息源,一个人 75%的信息获取来自视觉。
2. 图像处理的三个层次:
狭义图像:处理从图像到图像的过程(像素级);
图像分析:从 图像到数值或符号的过程(符号级);
图像理解:以客观世界分析客观世界(人工智能级)
3. 图像处理系统包括 采集,显示,存储,通信,处理和分析 五个模块
4. 数字图像处理 是指将图像信号转换成数字信号并利用计算机对其进行处理的过程
5.数据图像采样: 将空间上连续的图像变换成离散点的操作
6.数字图像的过程: 图像数字化是将一幅画面转化为计算机能处理的形式。
7. 数字图像处理的应用: 在生物医学中的应用,遥感航天,工业,军事公安领域,其他
8. 采样: 将空间上连续的图像变换成离散点的操作。
参数:采样间隔,采样孔径
9.采样孔径形状和大小与采样方式有关。 通常有 圆形,正方形,长方形,椭圆形
10. 采样方式 指采样间隔确定后,相邻像素间的位置关系:分开、相连、重叠
11. 量化: 将像素灰度转换成离散的整数值的过程。 5. 图像的数据量与采样间隔和量化等级有关
12. 灰度直方图: 反映的是一幅图像中各灰度级像素出现的频率之间的关系 频率 vi=ni/n
13. 直方图的应用:
1 判断图像量化是否正确
2 确定图像二值化的阈值
3 计算图像中物体 的面积
4 计算图像信息量 H H 公式
14. 图像增强目的:
1.采用一系列技术改善图像的视觉效果,提高图像的清晰度;
2.将图像 转换成一种更适合与人或机器进行分析处理的形式。
15. 卷积定理: 空间域;频率域。
空间域增强:直接对图像像素灰度进行操作
频率域增强:对图像经傅立叶变换后频谱成分进行操作,然后经傅立叶逆变换获得所需结果
16. 图像处理具体形式: 局部处理;迭代处理;跟踪处理;窗口处理和模板处理;串行处理和并 行处理。
局部处理: 在对输入图像进行处理时,计算某一输出像素 JP(i,j)值由输入图像 IP(i,j) 像素的小邻域 N[IP(i,j)]中的像素值确定。
17.图像的移动平均平滑法和空间域锐化
局部运算-图像锐化:图像锐化就是增强图像的边缘或轮廓
局部运算-图像平滑法:(邻域平均法或移动平均法)是一种直接在空间域进行平滑处理的 技术。假设图像由很多灰度恒定的小块组成,相邻像素间存在很高的空间相关性,噪声则是 统计独立的,可用像素邻域内各像素的灰度平均值代替该像素原来的灰度值,实现图像的平 滑。
18. 点处理: 在局部处理中,当输出值 JP(I,j)仅与 IP(I,j)像素灰度有关的处理。 对比度 增强,图像二值化,局部统计法
点运算-灰度变换: 灰度变换可使图像动态范围增大,图像对比度扩展,图像变清晰,特征 明显,是图像增强的重要手段之一
迭代处理: 反复对图像进行某种运算直至满足给定的条件,从而得到输出图像的处理形式。
邻域处理: 在对输入图像进行处理时,计算某一输出像素 JP(i,j)值由输入图像 IP(i,j) 像素的小领域 N[IP(i,j)]中的像素值确定的处理形式。 1
19. 图像数字化包括采样和量化两个过程
20. 图像变换的目的
1 使图像处理问题简化
2 有利于图像特征提取
3 有助于从概念上增强 对图像信息的理解
21. 离散傅立叶性质:周期性和共轭对称性;分离性;平均值;离散卷积定理;分配律
22.直方图修正法:大多数自然图像由于其灰度分布集中在较窄的区间,引起图像细节不够 清晰。采用直方图修整后可使图像的灰度间距拉开或使灰度分布均匀,从而增大反差,使图 像细节清晰,达到增强图像目的。直方图修正法通常有直方图均衡化及直方图规定化两类。
23. 直方图均衡化:通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图 的一种方法。 作用:能够自动增强图像的对比度;得到了全局均衡化的直方图,即均匀分 布;但效果不易控制。
24. 图像平滑: 任何一幅原始图像,在获取和传输等过程中,会受到各种噪声的干扰,使图 像质量下降,图像模糊,特征消失,对图像分析不利。为抑制噪声改善图像质量所进行的处 理叫做图像平滑或去噪。图像平滑是通过积分过程使图像边缘模糊。
25. 图像退化:图像在形成、传输和记录过程中,由于成像系统、传输介质和设备不完善, 导致图像质量下降。该现象称为图像退化。图像退化典型表现为图像模糊、失真、有噪声等。
26. 图像复原:图像的复原就是要尽可能的回复退化图像的本来面目,它是沿图像退化的逆 过程恢复图像。
过程:弄清退化原因-建立退化模型-反向推演-恢复图像。
准则:最小均方 准则、加权均方准则、最大熵准则
27. 图像复原与图像增强区别:二者的目的都是为了改善图像的质量,但图像增强不考虑 图像是如何退化的,只通过试探各种技术来增强图像的视觉效果。而图像复原需要知道图像 退化的机制和过程等先验条件,据此找出一种相应的逆过程解算方法,从而得到复原的图像。 如果图像已经退化,应先作复原处理,在做增强处理。
28. 图像编码与压缩:图像的编码与压缩就是对图像数据按一定的规则进行变换和组合,从 而达到以尽可能少的代码(符号)来表示尽可能多的信息。
29. 图像编码压缩分类:分为无误差编码和有误差编码两大类。
无损编码 中删除的仅仅是 图像数据中冗余的数据,经解码重建的图像和原始图像没有任何失真,常用于复制、保存十 分珍贵的历史、文物图像等场合;
有损编码 是指解码重建的图像与原图像相比有失真,不能 精确的复制,但视觉效果上基本相同,是实现高压缩比的编码方式,数字图像、图像传输和 多媒体等常用这类编码方式。
30. 图像分割:是指把图像分成互不重叠的区域并提取出感兴趣目标的技术。
目的:是由图像处理到图像分析的关键步骤。一方面,他是目的表达的基础,对特征测 量有重要的影响;另一方面,因为图形分割及其基于分割的目标表达、特征提取和参数测量 等,都将原始图像转化为更抽象、更紧凑的形式,是的更高层的图像分析和理解成为可能。
算法种类:边缘检测、边缘跟踪、区域分割、区域增长、和分裂-合并分割法等
31. 图像分析:对图像中感兴趣的目标进行检测和测量,以获取他们的客观信息,从而建立 对图像的描述。
32. 边缘检测:通过检查邻域,将边缘像素标识出的一种图像分割技术。边缘指图像中像素灰度 有阶跃变化或屋顶状变化的那些像素的集合。
33. 保真度准则:描述解码图像相对原始图像偏离程度的测度。 分类:客观保真度准则和主观保真度准则。 常用的客观保真度准则是原图像和解码图像之间的均方根误差和均方根信噪比。 主观保真度准则常用的方法是让一组(不少于 20 人)观察者观看图像并打分,将他们 对该图像的评分取平均,用来评价一幅图像的主观质量。
34. 图像增强:作为一种基本的图像处理技术,其目的是根据特定的需要突出图像中某些信 息,同时削弱或去除出一些不需要的信息,以获得更好更有用的图像。
35. 霍夫变换:是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定 一个物件、要辨别的形状的种类,算法会在参数空间中执行投票来决定物体的形状,而这是 由累加空间里的局部最大值来决定。是点到线的变换。 霍夫变换检测直线的抗噪性能强,能将断开的边缘连接起来。
36.基于边缘检测的霍夫变换的原理:把直线上点的坐标变换到过点的直线的系数域,通过 利用共线和直线相交的关系,使直线的提取问题转化为计数问题。
37.为什么进行傅里叶变换:为了时域和频域的转化。变完计算快;变完再变回也不慢 傅里叶变换:是一种分析信号的方法,分析信号的成分,也可用这些成分合成信号。许多波 形可作为信号的成分,比如正弦波、方波、锯齿波等,傅立叶变换用正弦波作为信号的成分。
38. 中值滤波:是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心像素的灰 度值的滤波方法。
特点:对脉冲干扰和椒盐噪声的抑制效果好,在抑制随机噪声的同时能 有效保护边缘少受模糊。但对点、线等细节较多的图像却不大合适。
39. 均值滤波的基本原理:是一种局部空间域处理的算法,就是对含有噪声的原始图像 f(x,y) 的每个像素点取一个领域 S,计算 S 中所有像素的灰度级平均值,作为空间域平均处理后图 像 g(x,y)像素值


在这里插入图片描述

在这里插入图片描述

2019-04-14 17:36:12 qq_34814092 阅读数 685
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4440 人正在学习 去看看 贾志刚

Java OpenCV-4.0.0 图像处理32 视频分析和对象跟踪 基于物体颜色的对象跟踪

Java OpenCV-4.0.0 图像处理34 视频分析和对象跟踪 基于物体颜色的对象跟踪
下面是 OpenCV 基于物体颜色的对象跟踪,如果视频中需要跟踪的物体的颜色相对于其他物体的颜色更为突出,可以使用基于颜色的物体跟踪的方法实现视频物体跟踪。
其中 Core.inRange 函数中的颜色的设置非常重要,比如小编这里的颜色设置最后的效果不是很理想。所有一般不是用 基于物体颜色的对象跟踪

package com.xu.opencv.objecttracking;

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

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;

/**  
 * 
 * @Title: ObjectTracking.java   
 * @Package com.xu.opencv.objecttracking 
 * @Description: OpenCV-4.1.0 背景消除
 * @author: xuhyacinth     
 * @date: 2019年7月19日 下午22:10:14   
 * @version: V-1.0 
 * @Copyright: 2019 xuhyacinth
 *
 */
public class ObjectTracking {

	static {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}

	public static void main(String[] args) {
		objectsTrackingBaseOnColor();
	}

	/**
	 * OpenCV-4.0.0 基于物体颜色的对象跟踪 多对象跟踪
	 * @return: void  
	 * @date 2019年7月19日 下午22:10:14 
	 */
	public static void objectsTrackingBaseOnColor() {
		// 1 创建 VideoCapture 对象
		VideoCapture capture=new VideoCapture();
		// 2 使用 VideoCapture 对象读取本地视频
		capture.open("C:\\Users\\Administrator\\Videos\\111.mp4");
		// 3 获取视频处理时的键盘输入 我这里是为了在 视频处理时如果按 Esc 退出视频对象跟踪
		int index=0;
		// 4 使用 Mat video 保存视频中的图像帧 针对每一帧 做处理
		Mat video = new Mat();
		// 5 根据自己的需求如果不需要再使用原来视频中的图像帧可以只需要上面一个 Mat video 我这里未来展示 处理后图像跟踪的效果
		Mat dealvideo = new Mat();
		// 6 获取视频的形态学结构 用于图像 开操作 降噪使用
		Mat kernel1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3, 3),new Point(-1, -1));
		// 7 获取视频的形态学结构 用于图像 膨胀 扩大跟踪物体图像轮廓
		Mat kernel2 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(5, 5),new Point(-1, -1));
		while (capture.read(video)) {
			// 8 颜色过滤  (根据跟踪物体在图像中的特定颜色找出图像 Core.inRange 会将这个颜色处理为白色 其他为黑色) 我这里是找出视频中的绿色移动物体
			// 8 颜色的设置会非常影响对象跟踪的效果
			Core.inRange(video,new Scalar(0, 127, 0),new Scalar(120, 255, 120), dealvideo);
			// 9 开操作(移除其他小的噪点)
			Imgproc.morphologyEx(dealvideo, dealvideo, Imgproc.MORPH_OPEN, kernel1,new Point(-1, -1), 1);
			// 10 膨胀 (突出特定颜色物体轮廓)
			Imgproc.dilate(dealvideo, dealvideo, kernel2,new Point(-1, -1), 4);
			// 11 找出对应物体在图像中的坐标位置(X,Y)及宽、高(width,height)轮廓发现与位置标定
			List<Rect> rects=process(dealvideo);
			// 12.1 在物体轮廓外画矩形
			//Imgproc.rectangle(video,new Point(rects.x,rects.y), new Point(rects.x+rects.width,rects.y+rects.height),new Scalar(0, 0, 255), 3, 8, 0);// 在物体轮廓外画矩形
			// 12.2 在物体轮廓外画矩形
			System.out.println("发现 "+rects.size()+" 对象");
			for (int i = 0; i < rects.size(); i++) {
				Imgproc.rectangle(video,new Point(rects.get(i).x, rects.get(i).y), new Point(rects.get(i).x + rects.get(i).width, rects.get(i).y + rects.get(i).height), new Scalar(255, 0, 0),1,Imgproc.LINE_AA,0);
			}
			//Imgproc.rectangle(dealvideo,rects,new Scalar(0, 0, 255), 3, 8, 0);
			//13 展示最终的效果
			HighGui.imshow("基于物体颜色的对象跟踪 多对象跟踪", video);
			index=HighGui.waitKey(100);
			if (index==27) {
				capture.release();
				return;
			}
		}
	}

	/**
	 * OpenCV-4.0.0 基于物体颜色的对象跟踪 单对象跟踪
	 * @return: void  
	 * @date 2019年7月19日 下午22:10:14  
	 */
	public static void objectTrackingBaseOnColor() {
		// 1 创建 VideoCapture 对象
		VideoCapture capture=new VideoCapture();
		// 2 使用 VideoCapture 对象读取本地视频
		capture.open("C:\\Users\\Administrator\\Videos\\111.mp4");
		// 3 获取视频处理时的键盘输入 我这里是为了在 视频处理时如果按 Esc 退出视频对象跟踪
		int index=0;
		// 4 使用 Mat video 保存视频中的图像帧 针对每一帧 做处理
		Mat video = new Mat();
		// 5 根据自己的需求如果不需要再使用原来视频中的图像帧可以只需要上面一个 Mat video 我这里未来展示 处理后图像跟踪的效果
		Mat dealvideo = new Mat();
		// 6 获取视频的形态学结构 用于图像 开操作 降噪使用
		Mat kernel1 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3, 3),new Point(-1, -1));
		// 7 获取视频的形态学结构 用于图像 膨胀 扩大跟踪物体图像轮廓
		Mat kernel2 = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(5, 5),new Point(-1, -1));
		while (capture.read(video)) {
			// 8 颜色过滤  (根据跟踪物体在图像中的特定颜色找出图像 Core.inRange 会将这个颜色处理为白色 其他为黑色) 我这里是找出视频中的绿色移动物体
			// 8 颜色的设置会非常影响对象跟踪的效果
			Core.inRange(video,new Scalar(0, 127, 0),new Scalar(120, 255, 120), dealvideo);
			// 9 开操作(移除其他小的噪点)
			Imgproc.morphologyEx(dealvideo, dealvideo, Imgproc.MORPH_OPEN, kernel1,new Point(-1, -1), 1);
			// 10 膨胀 (突出特定颜色物体轮廓)
			Imgproc.dilate(dealvideo, dealvideo, kernel2,new Point(-1, -1), 4);
			// 11 找出对应物体在图像中的坐标位置(X,Y)及宽、高(width,height)轮廓发现与位置标定
			Rect rects = new Rect();
			rects = process(dealvideo, rects);
			// 12.1 在物体轮廓外画矩形
			//Imgproc.rectangle(video,new Point(rects.x,rects.y), new Point(rects.x+rects.width,rects.y+rects.height),new Scalar(0, 0, 255), 3, 8, 0);// 在物体轮廓外画矩形
			// 12.2 在物体轮廓外画矩形
			Imgproc.rectangle(video,rects,new Scalar(0, 0, 255), 3, 8, 0);
			//Imgproc.rectangle(dealvideo,rects,new Scalar(0, 0, 255), 3, 8, 0);
			//13 展示最终的效果
			HighGui.imshow("基于物体颜色的对象跟踪 单对象跟踪", video);
			index=HighGui.waitKey(100);
			if (index==27) {
				capture.release();
				return;
			}
		}
	}

	/**
	 * OpenCV-4.0.0  基于物体颜色的对象跟踪 单对象跟踪
	 * <table border="1" cellpadding="10">
	 * <tr><td colspan="2" align="center">Imgproc.findContours() 函数 mode 和 method 参数解释</td></tr> 
	 * <tr><th align="center">Mode 输入参数</th><th align="center">参数解释</th></tr>
	 * <tr><td align="left">RETR_EXTERNAL</td><td align="left">只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略</td></tr>
	 * <tr><td align="left">RETR_LIST</td><td align="left">检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1</td></tr>
	 * <tr><td align="left">RETR_CCOMP</td><td align="left"> 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层</td></tr>
	 * <tr><td align="left">RETR_TREE</td><td align="left">检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。</td></tr>
	 * <tr><th align="center">Mthod 输入参数</th><th align="center">参数解释</th></tr>
	 * <tr><td align="left">CHAIN_APPROX_NONE</td><td align="left">保存物体边界上所有连续的轮廓点到contours向量内</td></tr>
	 * <tr><td align="left">CHAIN_APPROX_SIMPLE</td><td align="left">仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留</td></tr>
	 * <tr><td align="left">CHAIN_APPROX_TC89_L1</td><td align="left">使用teh-Chinl chain 近</td></tr>
	 * <tr><td align="left">CHAIN_APPROX_TC89_KCOS </td><td align="left">使用teh-Chinl chain 近</td></tr>
	 * @param dealvideo Mat
	 * @param rects Rect
	 * @return: Rect  
	 * @date 2019年7月19日 下午22:10:14  
	 */
	public static Rect process(Mat dealvideo,Rect rects) {
		// 1 跟踪物体在图像中的位置
		List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
		// 2 
		Mat hierarchy=new Mat();
		// 3 找出图像中物体的位置
		//Imgproc.findContours(dealvideo, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE,new Point(0, 0));
		Imgproc.findContours(dealvideo, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE,new Point(0, 0));
		if (contours.size() > 0) {// 4.1 如果发现图像
			double maxarea = 0.0;
			for (int t = 0; t < contours.size(); t++) {
				double area = Imgproc.contourArea(contours.get(t));
				if (area > maxarea) {
					maxarea = area;
					rects = Imgproc.boundingRect(contours.get(t));
				}
			}
		} else {// 4.2 如果没有发现图像
			rects.x = rects.y = rects.width = rects.height = 0;
		}
		return rects;
	}

	/**
	 * OpenCV-4.0.0 基于物体颜色的对象跟踪 多对象跟踪
	 * <table border="1" cellpadding="10">
	 * <tr><td colspan="2" align="center">Imgproc.findContours() 函数 mode 和 method 参数解释</td></tr> 
	 * <tr><th align="center">Mode 输入参数</th><th align="center">参数解释</th></tr>
	 * <tr><td align="left">RETR_EXTERNAL</td><td align="left">只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略</td></tr>
	 * <tr><td align="left">RETR_LIST</td><td align="left">检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1</td></tr>
	 * <tr><td align="left">RETR_CCOMP</td><td align="left"> 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层</td></tr>
	 * <tr><td align="left">RETR_TREE</td><td align="left">检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。</td></tr>
	 * <tr><th align="center">Mthod 输入参数</th><th align="center">参数解释</th></tr>
	 * <tr><td align="left">CHAIN_APPROX_NONE</td><td align="left">保存物体边界上所有连续的轮廓点到contours向量内</td></tr>
	 * <tr><td align="left">CHAIN_APPROX_SIMPLE</td><td align="left">仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留</td></tr>
	 * <tr><td align="left">CHAIN_APPROX_TC89_L1</td><td align="left">使用teh-Chinl chain 近</td></tr>
	 * <tr><td align="left">CHAIN_APPROX_TC89_KCOS </td><td align="left">使用teh-Chinl chain 近</td></tr>
	 * @param video Mat
	 * @return: List<Rect>  
	 * @date 2019年7月19日 下午22:10:14 
	 */
	public static List<Rect> process(Mat video) {
		// 1 跟踪物体在图像中的位置
		List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
		// 2找出图像中物体的位置
		Imgproc.findContours(video, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE,new Point(7,7));
		// 3 对象结果
		List<Rect> rects=new ArrayList<Rect>();
		Rect rect;
		if (contours.size() > 0) {// 4.1 如果发现图像
			for (int i = 0; i < contours.size(); i++) {
				rect=new Rect();
				double area = Imgproc.contourArea(contours.get(i));
				if (area > 0.0) {
					rect = Imgproc.boundingRect(contours.get(i));
				} else {
					rect.x = rect.y = rect.width = rect.height = 0;
				}
				rects.add(rect);
			}
		} else {// 4.2 如果没有发现图像
			rect=new Rect();
			rect.x = rect.y = rect.width = rect.height = 0;
			rects.add(rect);
		}
		return rects;
	}



}

效果

2014-03-25 11:36:35 C_Bright 阅读数 4158
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4440 人正在学习 去看看 贾志刚

Python图像处理库:

一:PIL

PythonWare公司提供了免费的图像处理工具包 PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发。

在PIL中,任何一副图像都是用一个Image对象表示,而这个类由和它同名的模块导出,因此,要加载一副图像,最简单的形式是这样的:

import Image
img = Image.open(“dip.jpg”)

注意:第一行的Image是模块名;第二行的img是一个Image对象; Image类是在Image模块中定义的。关于Image模块和Image类,切记不要混淆了。现在,我们就可以对img进行各种操作了,所有对img的 操作最终都会反映到到dip.img图像上。

项目主页:http://www.open-open.com/lib/view/home/1329487881203

二:Pillow

Pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。

Pillow 为了解决 PIL 的两个问题:

1. 不兼容 setuptools 
2. 报告的问题太多,而更新太慢 

项目主页:http://www.open-open.com/lib/view/home/1376959572788

三:Mahotas

Mahotas 是一个 Python 的图像处理库,包含大量的图像处理算法,使用 C++ 实现的算法,处理性能相当好。

目主页:http://www.open-open.com/lib/view/home/1329050076921

四:Pymorph

Pymorph 包含一组纯 Python 实现的图像形态处理函数,例如 erode, dilate, open, tophat opening, and watershed。

项目主页:http://www.open-open.com/lib/view/home/1329487525890


数字图像处理(一)

阅读数 548

Android的图像处理

阅读数 267

初识python图像处理

阅读数 4328

没有更多推荐了,返回首页