OpenCV学习总结之C++版

电子说

1.2w人已加入

描述

本文中代码所采用的是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;
}
  • 第四个程序:canny边缘检测

先载入图像,并将其转成灰度图,再用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从视频文件或摄像头捕获视频并显示出来

有两种写法,分别是:

  1. 先实例化,再初始化

VideoCapture video; video.open("one.mp4");

  1. 在实例化的同时进行初始化

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;
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分