0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV学习总结之C++版

jf_78858299 来源:鬼才薛定谔 作者: CatalinChao 2023-02-07 16:03 次阅读

本文中代码所采用的是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从视频文件或摄像头捕获视频并显示出来

有两种写法,分别是:

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

    关注

    27

    文章

    1279

    浏览量

    56594
  • API
    API
    +关注

    关注

    2

    文章

    1480

    浏览量

    61765
  • 开源
    +关注

    关注

    3

    文章

    3234

    浏览量

    42352
  • OpenCV
    +关注

    关注

    29

    文章

    625

    浏览量

    41223
收藏 人收藏

    评论

    相关推荐

    关于C++模板总结

    大家好,今天给大家分享一篇关于 C++ 模板总结概述。
    发表于 09-19 11:55 488次阅读

    C++STL算法(二)

    C++STL算法(二)
    的头像 发表于 07-18 14:49 955次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    C++文件操作

    C++文件操作
    的头像 发表于 07-21 10:52 1074次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    OpenCV C++程序编译与演示

    1、在JetsonNano上编译OpenCV源码与OpenCV C++ YOLOv5程序演示  编译OpenCV最新4.5.x版本  Jetson Nano自带的
    发表于 11-10 16:42

    CC++学习过程总结

      总是被同学们问到,如何学习CC++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。   一家之言,欢迎拍砖哈。   1、可以考虑先学习
    发表于 09-10 11:42 1235次阅读

    OpenCV2.3的C++速查表免费下载

    本文档的主要内容详细介绍的是OpenCV2.3的C++速查表免费下载。
    发表于 11-06 17:48 4次下载

    C++指针的学习建议

     一。对于众多人提出的c/c++中指针难学的问题做个总结
    发表于 11-07 17:13 8次下载
    <b class='flag-5'>C++</b>指针的<b class='flag-5'>学习</b>建议

    如何使用Borland C++ Builder6.0来开发OpenCV的程序

    本文档的主要内容详细介绍的是如何使用Borland C++ Builder6.0来开发OpenCV的程序。
    发表于 05-26 17:32 14次下载
    如何使用Borland <b class='flag-5'>C++</b> Builder6.0来开发<b class='flag-5'>OpenCV</b>的程序

    C++中类的继承访问级别学习总结(二)

    上一篇文章我们介绍了c++中类的继承学习总结;今天我们继续来分享c++中类的继承中的访问级别的学习总结
    的头像 发表于 12-24 16:10 709次阅读

    C++重载函数学习总结

    函数重载是c++c的一个重要升级;函数重载通过参数列表区分不同的同名函数;extern关键字能够实现cc++的相互调用;编译方式决定符号表中的函数名的最终目标名
    的头像 发表于 12-24 17:10 772次阅读

    C++静态成员变量和静态成员函数学习总结

    今天继续分享c++的文章,学习还是不能落下,flag未完成,任务艰巨,好好学习
    的头像 发表于 12-24 17:12 422次阅读

    Linux C/C++ 学习路线

    一、秋招 Linux C/C++ offer 情况二、Linux C/C++ 方向的一些思考三、计算机基础知识的梳理四、C++ 方向的深入
    发表于 11-06 19:36 14次下载
    Linux <b class='flag-5'>C</b>/<b class='flag-5'>C++</b> <b class='flag-5'>学习</b>路线

    运用JNI连结OpenCV开发C++并打包成aar lib的使用教学

    本身是作影像视觉相关的工作,多数时候都使用 Python 作为开发语言,但OpenCV 本身是C++开发,学 C++ 应该有帮助。
    的头像 发表于 08-15 09:24 1507次阅读

    C++学习笔记c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助
    的头像 发表于 03-17 13:57 692次阅读

    OpenCV图像识别C++代码

    的头文件 在您的C++代码中,包含以下必要的头文件: # include # include # include # include # include # include # include 读取图像
    的头像 发表于 07-16 10:42 1669次阅读