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

    关注

    26

    文章

    1242

    浏览量

    56113
  • API
    API
    +关注

    关注

    2

    文章

    1437

    浏览量

    61233
  • 开源
    +关注

    关注

    3

    文章

    3040

    浏览量

    41829
  • OpenCV
    +关注

    关注

    29

    文章

    614

    浏览量

    40908
收藏 人收藏

    评论

    相关推荐

    学习C++

    有意学习C++的朋友,可以加QQ群383309549,完全公益,免费授课,本群只接受没有程序设计经验、想学习C++程序设计的朋友哟!!{:1:}
    发表于 07-29 21:51

    【DragonBoard 410c试用体验】OpenCV加载图片实验

    );// 【3】等待任意按键按下waitKey(0);} 具体效果如下:说明:OpenCV中的C++类和函数都是定义在命名空间cv之内的,有两种方法可以访问。第一种是,在代码开头的适当位置,加上
    发表于 09-10 19:16

    OpenCV学习资料汇总(入门教程+实例程序)

    问题观察,发现有很大比例的问题是因为用户对 C/C++语言不熟练,导致出错,或出错后不知如何解决。如果对 C/C++语言不熟悉,那使用 OpenCV
    发表于 10-24 15:23

    C++能用来做什么?

    `C++个人学习经验:应该很多人不知道学习C++究竟有什么用,听到别人去学了C++后,也盲目跟着学习
    发表于 08-13 08:00

    学习c++的经验分享!

    转自:http://www.cndzz.com/download/4094_0/111678.html 学习学好c++的50条忠告1.把C++当成一门新的语言学习(和
    发表于 10-08 03:46

    如何学习C++,如何学好C++

    最近,很多学员都给我发邮件问我应该如何学习C++,如何学好C++?那么作为一个从C语言小白摸爬滚打、入坑无数到成长为如今的高级C++游戏开发
    发表于 08-20 06:27

    Linux C/C++ 学习路线相关资料下载

    一、秋招 Linux C/C++ offer 情况二、Linux C/C++ 方向的一些思考三、计算机基础知识的梳理四、C++ 方向的深入
    发表于 11-11 06:36

    学习C++的方法以及C++的就业方向

    学习方向:嵌入式+人工智能嵌入式是一门技术学习目标1.嵌入式开发概述;(面向对象在嵌入式开发中角色)2.嵌入式Linux C++编程;(C++概述、
    发表于 12-24 07:32

    OpenCV C++程序编译与演示

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

    C和C++学习过程总结

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

    opencv基础的学习手册

    the so-called OpenCV 2.x API, which is essentially a C++ API, as opposite to the C-based OpenCV 1.x API.
    发表于 08-25 15:52 0次下载

    opencv二值化图像去噪学习总结

    OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac
    发表于 11-29 16:03 4.9w次阅读

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

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

    Linux C/C++ 学习路线

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

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

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