OpenCV HighGUI 摄像头边沿提取 初体验

版权声明:转载请注明出处 https://blog.csdn.net/qq_27350133/article/details/81319604

OpenCV初次尝试

初次接触OpenCV是以 浅墨OpenCV编程入门 作为参考,OpenCV作为一个开源计算机视觉库,提供了很多实用的接口。本次尝试是在我在学习HighGUI章节之后的一点点尝试。

概述

从摄像头读取图像,然后经过灰度处理>均值滤波>边沿提取 并且绘制滑动条可以实时调整边沿提取的阈值。


  1. 尝试HighGUI的使用
  2. 熟悉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

猜你喜欢

转载自blog.csdn.net/qq_27350133/article/details/81319604