本文中代码所采用的是OpenCV4.6.0,采用Cmake来管理工程,mac系统
OpenCV简介
OpenCV是“开源计算机视觉库”,「Open Sourec Computer Vision Library」,是一个基于开源发行的跨平台计算机视觉库,包含了许多图像处理和计算机视觉方面的通用算法,这里主要学习其api的应用。
快速上手OpenCV图像处理
- 第一个程序:图像显示,代码如下
//
// Created by on 2022/11/9.
//
#include //相关头文件
using namespace std;
int main() {
cv::Mat srcImage = cv::imread("../dog.jpg"); //载入图像
cv::imshow("[原始图]", srcImage); //显示图像
cv::waitKey(0); //等待用户任意键按下才终止窗口
return 0;
}
- 第二个程序:图像腐蚀
腐蚀是最基本的形态学运算之一:就是用图像中的暗色部分“腐蚀”掉图像中的高亮部分
部分。
显示效果如上图
代码如下:
//
// Created by on 2022/11/9.
//
#include //模块头文件
#include //图像处理头文件
//using namespace cv; //cv命名空间
int main() {
//载入原图,保存在Mat矩阵类对象中
cv::Mat srcImage = cv::imread("../cat.jpeg");
//显示原图
cv::imshow("faster",srcImage);
//进行腐蚀操作
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(15, 15));
cv::Mat dstImage;
cv::erode(srcImage, dstImage, element);
//显示效果图
cv::imshow("laster", dstImage);
cv::waitKey(0);
return 0;
}
getStructuringElement函数返回一个指定形状和尺寸的内核矩阵,然后调用erode函数进行图像腐蚀操作。
- 第三个程序:图像模糊
对图像进行均值滤波操作,主要使用到blur函数
代码如下:
//
// Created by on 2022/11/9.
//
#include
#include
//using namespace cv;
int main() {
cv::Mat srcImage = cv::imread("../cat.jpeg");
cv::imshow("src picture", srcImage);
//进行均值滤波操作
cv::Mat dstImage;
cv::blur(srcImage, dstImage, cv::Size(7, 7));
//显示效果图
cv::imshow("last picture", dstImage);
cv::waitKey(0);
return 0;
}
先载入图像,并将其转成灰度图,再用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测,最后进行显示
代码如下:
//
// Created by on 2022/11/9.
//
#include
#include
//using namespace std;
int main() {
cv::Mat srcImage = cv::imread("../cat.jpeg");
cv::imshow("canny test", srcImage); //显示原始图
//将原始图像转化为灰度图像
cv::Mat dstImage, edge, grayImage;
//创建与原图同类型和大小的矩阵 dst
dstImage.create(srcImage.size(), srcImage.type());
//将原图像转换为灰度图像
cv::cvtColor(srcImage, grayImage, cv::COLOR_BGR2GRAY);
//先使用3x3的内核矩阵来降噪
cv::blur(grayImage, edge, cv::Size(3, 3));
//运行Canny 算子
cv::Canny(edge, edge, 3, 9, 3);
//显示效果图
cv::imshow("edge test", edge);
cv::waitKey(0);
return 0;
}
- 第五个程序:读取并播放视频
使用VideoCapture从视频文件或摄像头捕获视频并显示出来
有两种写法,分别是:
- 先实例化,再初始化
VideoCapture video; video.open("one.mp4");
- 在实例化的同时进行初始化
VideoCapture video("one.mp4");
视频读入到VideoCapture类对象之后,紧接着可以用一个循环将每一帧显示出来,相关代码如下:
等)时,在头部直接指定,如:```javascript,如下:
//
// Created by 方 on 2022/11/9.
//
#include
using namespace cv;
int main() {
//1. 读入视频
VideoCapture video("../one.mov");
//2. 循环显示每一帧
while(1) {
Mat frame; //定义一个Mat对象,用来存储每一帧图像
video>>frame; //读取当前帧
imshow("read_video", frame); //显示当前帧
waitKey(30); //延时30ms
}
return 0;
}
- 第六个程序:调用摄像头采集图像
只需将上述代码中的视频文件名“one.mov”换成0就行,即VideoCapture(0)表示调用摄像头而不是从文件中读取视频, 注意不要添加""
结合摄像头调用实例程序来配合canny边缘检测,得到canny边缘检测并高斯模糊后的摄像头采集视频,代码如下:
//
// Created by on 2022/11/9.
//
#include
int main() {
//从摄像头读入视频
cv::VideoCapture video(0);
cv::Mat edge;
//循环显示每一帧
while(1) {
//1. 读入图像
cv::Mat frame; //定义一个Mat变量,用于存储每一帧的图像
video >> frame; //读取当前帧
//2. 将原图转换成灰度图
cv::cvtColor(frame, edge, cv::COLOR_BGR2GRAY);
//3. 使用3x3的内核矩阵来进行降噪 2x3+1=7
cv::blur(edge, edge, cv::Size(7,7)); //进行模糊
//4. 进行canny边缘检测并显示
cv::Canny(edge, edge, 0, 30, 3);
cv::imshow("the video after canny", edge); //显示经过处理后的当前帧
if(cv::waitKey(30) >= 0)
break; //延时30ms
}
return 0;
}
-
图像处理
+关注
关注
27文章
1279浏览量
56594 -
API
+关注
关注
2文章
1480浏览量
61765 -
开源
+关注
关注
3文章
3234浏览量
42352 -
OpenCV
+关注
关注
29文章
625浏览量
41223
发布评论请先 登录
相关推荐
评论