目录
1.图像显示
2.图像腐蚀
3.图像模糊
4.canny边缘检测
5.读取并播放视频
新版本的OpenCV中,图像现实过程非常简单,只需用 imread 函数载入到新版本的图像存储数据结构 Mat 类中,然后使用 imshow 函数显示即可。本文使用的是VS2017编辑器,OpenCV3.4,新建控制台应用程序后,新建一个.cpp文件,添加如下代码:
#include
using namespace cv;
int main()
{
Mat srcImage = imread("pic.jpg");
imshow("原始图像", srcImage);
waitKey(0);
return 0;
}
其中,#include
接着读取并显示图片,最后调用waitKey函数使图片窗口一直显示知道用户按下按键。即可显示图片
腐蚀是最基本的形态学运算之一,即用图像中的暗色部分“腐蚀”掉图像中的高亮部分。同样新建项目,新建源文件,放置名为cat.jpg 的图片到cpp源文件同一目录下。代码如下:
#include
#include
using namespace cv;
int main()
{
Mat srcImage, dstImage;
srcImage = imread("cat.jpg");
imshow("原图像", srcImage);
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
erode(srcImage, dstImage, element);
imshow("腐蚀操作后的图像", dstImage);
waitKey(0);
return 0;
}
首先,使用#include 分别包含OpenCV的 highgui 模块头文件和 图像处理模块头文件,接着读入并显示原图像。然后定义一个Mat 类型的变量来获得getStructuringElement 函数的返回值,该函数返回值为指定形状和尺寸的结构元素(内核矩阵)。接着便使用 erode 函数来进行腐蚀操作。原图和进行腐蚀操作后的效果图如下所示:
简单看一下使用OpenCV 对图像进行均值滤波操作来对其进行模糊处理。代码如下所示:
#include
#include
using namespace cv;
int main()
{
Mat srcImage, dstImage;
srcImage = imread("cat.jpg");
imshow("原图像", srcImage);
blur(srcImage, dstImage, Size(5, 5));
imshow("均值滤波后的图像", dstImage);
waitKey(0);
return 0;
}
blur 函数对载入图像进行均值滤波已达到模糊图像的目的。可以进行图像噪声的处理。
原图及均值滤波模糊后的效果图如下:
边缘检测也是图像处理中经常用到的部分。载入原图像,并将其转成灰度图,再用blur函数进行模糊处理以降噪,然后使用canny函数进行边缘检测。代码如下:
#include
using namespace cv;
int main()
{
Mat srcImage, dstImage;
srcImage = imread("cat.jpg");
imshow("原图像", srcImage);
cvtColor(srcImage, dstImage, CV_BGR2GRAY);
blur(dstImage, dstImage, Size(3, 3));
Canny(dstImage, dstImage, 3, 9, 3);
imshow("边缘检测后的效果图", dstImage);
waitKey(0);
return 0;
}
原图及Canny边缘检测后的效果图如下所示:
VideoCapture 是 OpenCV 2.X 中新增的一个类,对应于之前C 语言版本的CvCapture 结构体。它提供了从摄像机或视频文件中捕获视频的 C++ 接口。
读取视频文件代码如下:
#include
using namespace cv;
int main()
{
VideoCapture capture;
capture.open("demo.avi");
//VideoCapture capture("demo.avi");
while (1)
{
//定义一个Mat 变量,用于存储每一帧的图像
Mat frame;
//读取当前帧
capture >> frame;
//若视频播放完成,退出循环
if (frame.empty())
break;
//显示当前帧
imshow("读取视频", frame);
//延迟30ms
waitKey(30);
}
return 0;
}
读取摄像头视频图像代码如下:
#include
using namespace cv;
int main()
{
VideoCapture capture(0);
while (1)
{
//定义一个Mat 变量,用于存储每一帧的图像
Mat frame;
//读取当前帧
capture >> frame;
//若视频播放完成,退出循环
if (frame.empty())
break;
//显示当前帧
imshow("读取视频", frame);
//延迟30ms
waitKey(30);
}
return 0;
}