OpenCV初次尝试
初次接触OpenCV是以 浅墨 的 OpenCV编程入门 作为参考,OpenCV作为一个开源计算机视觉库,提供了很多实用的接口。本次尝试是在我在学习HighGUI章节之后的一点点尝试。
概述
从摄像头读取图像,然后经过灰度处理>均值滤波>边沿提取 并且绘制滑动条可以实时调整边沿提取的阈值。
- 尝试HighGUI的使用
- 熟悉OpenCV部分函数的使用方法
代码段
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define WinName "opencv"
int thr1 = 3, thr2 = 9; //初始化两阈值
Mat frame,edges;
void changeThr1(int, void*)//滑动条回调函数
{
//这儿阈值变量为全局变量 根本不需要传参就能改变它的值
//thr1 = thr1;
}
void changeThr2(int, void*)
{
//thr2 = thr2;
}
void createWin()//创建图像窗口
{
namedWindow(WinName, WINDOW_AUTOSIZE);
createTrackbar("thr1", WinName, &thr1, 255, changeThr1);//创建滑动条以控制阈值
createTrackbar("thr2", WinName, &thr2, 255, changeThr2);
}
int main()
{
VideoCapture video;
video.open(0); //打开摄像头
createWin();
while (1)
{
video.read(frame); //读取摄像头捕获的一帧
cvtColor(frame, frame, COLOR_BGR2GRAY); //转换为灰度图
blur(frame, frame, Size(3, 3)); //均值滤波
Canny(frame, edges, thr1, thr2); //Canny算子边缘提取
imshow(WinName, edges);
if (waitKey(30) == 27)
break;
}
return 0;
}
效果
心得
- 由于之前接触过Qt,对HighGUI的理解就是和Qt区别不大:需要触发事件和响应事件,因此在写HighGUI时感觉有点别扭,但是也按Qt的方式来写,结果能行。可以看出,GUI的机制都大致相同,难度不会太大。
在写OpenCV程序的时候参数传递错误导致内存泄漏,查了才找到问题,传参一定要注意。将
cvtColor(frame, frame, COLOR_BGR2GRAY)
错写为cvtColor(frame, frame, COLOR_GRAY2BGR)
导致内存泄漏,555~~————————- 7/31/2018 8:55:13 PM