把一张图片命名为 “1.jpg” 放进项目文件下
#include
#include"opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("1.jpg");//载入图像
imshow("【原始图】", srcImage);//显示图像
waitKey(0);//等待任意键按下
return 0;
}
#include
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("1.jpg");//载入图像
imshow("【原始图】", srcImage);//显示图像
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstImage;
erode(srcImage, dstImage, element);//显示效果图
imshow("【腐蚀】", dstImage);//显示图像
waitKey(0);//等待任意键按下
return 0;
}
程序首先依然是载入和显示一幅图像,然后定义一个Mat类型的变量来获得 getStructuringElement函数的返回值,而getStructuringElement函数的返回值为指 定形状和尺寸的结构元素(内核矩阵)。参数准备完毕,接着便可以调用erode函 数进行图像腐蚀操作,最后调用imshow函数进行显示,用waitKey函数等待按键 按下,以便能让窗口一直显示,
#include
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("1.jpg");//载入图像
imshow("【原始图】", srcImage);//显示图像
Mat dstImage;
blur(srcImage, dstImage, Size(7, 7));//进行均值滤波(模糊)操作
imshow("【均值滤波】", dstImage);//显示图像
waitKey(0);//等待任意键按下
return 0;
}
载入图像,并将其转换成灰度图。用blur函数进行图像模糊以降噪,再用Canny函数进行边缘检测。最后显示。
#include
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("1.jpg");//载入图像
imshow("【原始图】Canny边缘检测", srcImage);//显示原始图
Mat dstImage,edge,grayImage;//参数定义
dstImage.create(srcImage.size(), srcImage.type());//创建与src同类型和大小的矩阵(dst)
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);//将原图像转换为灰度图像(此代码openCV2与openCV3不同,此处为openCV3)
blur(grayImage, edge, Size(3, 3));//使用3x3内核来降噪
Canny(edge, edge, 3, 9, 3);//运行Canny算子
imshow("【效果图】Canny边缘检测", edge);//显示图像
waitKey(0);//等待任意键按下
return 0;
}
VideoCapture 类负责视频的读取,使用重载的输出运算符 “>>” 可以很方便地从文件中读取一帧图像。
在 VideoCapture 初始化的时候,会预先读入需要的视频信息,例如视频大小、格式、分辨率等。由于OpenCV3对视频的处理使用ffmepg开源项目,因此只要是ffmpeg支持的视频格式类型VideoCapture类就可以正常操作 。
视频读取流程为: 文件 -> 文件信息读取 -> 【 逐帧读取 -> ffmpeg 解码 -> 显示 】(此处循环)
视频显示:
使用for循环读取和显示视频,当视频读取完毕或者用户有键盘输入时,读取循环结束。在每帧读取显示完毕后延迟 33ms ,这主要是用于视频的帧控制 ,如果不做帧控制则视频文件会很快被读取完,显示的视频也是相当快速的。
#include
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap;
cap.open("test.mp4");//将"test.mp4"换成 0 为调用摄像头采集图像cap.open(0);
if (!cap.isOpened())
return -1;
namedWindow("OpenCV3", WINDOW_AUTOSIZE);
Mat frame;
for (;;)
{
cap >> frame;
if (frame.empty())
break;
imshow("OpenCV3", frame);
if (waitKey(33) >= 0)//在每帧读取显示完毕后延迟 33ms
break;
}
waitKey(0);//等待任意键按下
destroyWindow("OpenCV3");
return 0;
}
已经可以实现读取和显示视频了。
现在在视频显示之前对每帧进行简单处理
#include
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap;
cap.open("test.mp4");
if (!cap.isOpened())
return -1;
namedWindow("OpenCV3-In", WINDOW_AUTOSIZE);//WINDOW_NORMAL可以自由放缩窗口大小
namedWindow("OpenCV3-Out", WINDOW_NORMAL);//WINDOW_AUTOSIZE 窗口大小固定
Mat frame;
for (;;)
{
cap >> frame;
if (frame.empty())
break;
Mat out;
//GaussianBlur(frame, out, Size(5, 5), 3, 3);// 高斯滤波 Size(5,5) 用于产生高斯滤波的模板,一般模板尺寸为奇数
//pyrDown(frame, out); //图像金字塔下采样 将视频大小(长、宽)变为原来的一半
// Canny边缘检测
//Mat gray;
//cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
//cv::Canny(gray, out, 10, 100, 3, true);
imshow("OpenCV3-In", frame);
imshow("OpenCV3-Out", out);
if (waitKey(33) >= 0)
break;
}
destroyWindow("OpenCV3");
return 0;
}
高斯滤波
Canny 边缘检测