OpenCV4,5个方法让你从小白到大佬

  • 目录
    • 1、简介
    • 2、使用auto关键字,避免过长类型变量声明
    • 3、使用std::vector,
    • 4、学会使用字符串流
    • 5、最后一个是学会使用map容器
    • 关注苏州程序大白,持续更新技术分享。谢谢大家支持

目录

1、简介

我之前在群里看到好多朋友halcon转opecv的学习都很难的。今天我给大家讲讲。学习C++版本的OpenCV会很难,是否需要基础知识。其实这里大家有个很深的误解,OpenCV早期的语法都是基于C++98,这个语法比较坑,让大家学习起来感觉很难。但是后来OpenCV3之后,特别是OpenCV4以来早就支持标准的C++11语法了,很多接口跟函数都特别容易理解,C++11可以说应用最广泛的C++标准之一了,语法通俗易懂,大量智能指针加持,支持各种标准容器操作,可以说跟C#与Java这样的面向对象语言的语法基本完全类似,可以让你轻松驾驭,只要你接触过面向对象的编程语言,可以说零基础学习OpenCV C++完全不是问题,当然有几个最常用的语法跟容器可能需要提前铺垫一下,我这里也从实际项目跟代码实践总结出下面C++基础知识点,帮助大家在学习OpenCV C++的时候可以更快,更好的入门。
下面我们做代码演示如下:

// 输出与打印字符串与数字
std::cout << "Hello World, OpenCV" << cv::getVersionMajor()<<"."<<cv::getVersionMinor()<<std::endl;
// 打印Mat矩阵
cv::Mat m1 = cv::Mat(3, 3, CV_8UC1);
std::cout <<"m1=" <<m1 << std::endl;

运行结果如下:

2、使用auto关键字,避免过长类型变量声明

C++11支持auto关键字推导,这个可以避免很多不必要的书写,提供代码编写效率。提升代码的整洁跟优雅度,是个很好用的关键字。代码演示如下:

// 使用auto关键字,实现自动类型推导与识别
auto t1 = 3; // 推导为int类型
auto t2 = 3.0; // 推导为double
// 推导为cv::Mat类型
auto m2 = cv::Mat(3, 3, CV_8UC1);
// 直接用auto避免类型书写
// cv::Ptr<ORB> orb_detecto = cv::ORB::create();
auto orb_detecto = cv::ORB::create();

特别注意:auto不能作为函数参数!

3、使用std::vector,

这个在OpenCV的程序中被大量使用,特别是在二值图像分析,特征提取等模块中,所以掌握vector容器的语法跟函数操作很重要。代码演示部分比较长,涉及到vector容器的定义初始化、添加元素、排序、几种循环fectch方式,删除元素、合并多个vector为一个等。全部的代码演示如下:

// 使用数组容器 - 直接定义
std::vector<int> a;
// 初始化定义
std::vector<int> b{ 3,2,1,4,6,5,9,8,7 };
// 循环fetch元素
for (auto i : b) {std::cout <<"for-loop方式"<< i << std::endl;
}
// 迭代器方式fetch元素
for (auto it = std::begin(b); it != std::end(b); ++it) {std::cout << "迭代器方式: " << *it << std::endl;
}
// for-each方式
std::for_each(std::begin(b), std::end(b), process);
// 容器合并
a.push_back(22);
a.push_back(11);
b.insert(b.end(), a.begin(), a.end());
std::cout << "打印合并之后的数组:" << std::endl;
for (auto ab : b) {std::cout << ab <<" " ;
}
std::cout << " " << endl;// 排序
std::sort(b.begin(), b.end());
std::cout << "打印排序之后的数组:" << std::endl;
for (auto ab : b) {std::cout << ab << " ";
}
std::cout << " " << endl;
// 保留前面N个
auto n = 5;
b.erase(b.begin() + n, b.begin() + b.size());
for (auto ab : b) {std::cout <<"打印删除后的剩余元素: "<< ab << std::endl;
}

运行结果如下:

4、学会使用字符串流

std::stringstream是一个非常有用的格式化输出,在OpenCV中如何什么想输出的数据类型从int\float\double\string都可以往里面扔,拼接在一起,最后只要调用一下str()方法就会全部转换为str,可以输出到图像,文本、控制台上,非常的方便。特别是通过putText输出到图像上。代码演示如下:

// 字符串流,任意拼接
std::stringstream ss;
ss << "Hello World, " << "OpenCV";
auto version = 4.5;
ss << version;
cv::putText(image, ss.str().c_str(), cv::Point(20, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(0, 0, 255), 2, 8);
cv::imshow("图像", image);

运行结果如下:

5、最后一个是学会使用map容器

这个在OpenCV与OpenVINO中被大量使用,OpenVINO的输入与输出信息格式就是这种map对象,代码演示了map对象的添加与循环fetch元素的方式,演示代码如下:

// map对象实现key-value操作
std::map<int, std::string> labels;
labels.insert(std::pair<int, std::string>(0, "background"));
labels.insert(std::pair<int, std::string>(1, "person"));
labels.insert(std::pair<int, std::string>(2, "car"));
labels.insert(std::pair<int, std::string>(3, "road"));// 获取map对象, for-loop方式
std::cout << "map对象循环,for-loop方式" << std::endl;
for (auto item : labels) {std::cout << item.first << ","<<item.second <<std::endl;
}
// 获取map对象, 迭代器方式
std::cout << "map对象循环,迭代器方式" << std::endl;
for (auto it = labels.begin(); it != labels.end(); ++it) {std::cout << it->first << "," << it->second << std::endl;
}

运行结果如下:

关注苏州程序大白,持续更新技术分享。谢谢大家支持

OpenCV4,5个方法让你从小白到大佬相关推荐

  1. android studio安装教程完整,Android Studio 安装配置方法完整教程【小白秒懂】

    1.安装包下载 安装包我们可以在官网下载,但为了让大家更方便,点击链接直接保存就好啦!! 2.Android Studio 安装- 打开安装包,点next - 点next - 这步要注意了,这里填安装 ...

  2. 不带头节点的链表有哪些缺点_23张图!万字详解「链表」,从小白到大佬!

    链表和数组是数据类型中两个重要又常用的基础数据类型. 数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解 ...

  3. Visionpro从小白到大佬,第一章了解工具名称和用途

    Visionpro从小白到大佬,第一章了解工具名称和用途 目录 1.简介 2.无非类工具 3.Calibration & Fixturing 4. Color 5. Geometry - Cr ...

  4. 为什么枪火游侠是服务器维护中,《枪火游侠》小白求助大佬。请问别人的维克多为什么是连发。我的维克多是三发...

    东京买手:我是ps4.直接ps4商店里面下的 发布于 2020-04-30 15:08:19 雷爆侠:兄弟 这游戏怎么下 发布于 2020-04-30 11:07:09 硎锋:三连发威力强些,前提你可 ...

  5. 【学习OpenCV4】图像变换方法总结(放缩、翻转、旋转)

    图像变换方法 一.图像放缩Resize 二.图像翻转flip 三.图像旋转warpAffine 一.图像放缩Resize 1.1 基本知识   图像放缩用到了许多插值方法,常见的差值算法有线性插值.立 ...

  6. 一、Pytho第一课——Python安装及配置路径方法(最详细小白教程,没有之一。如若不懂,不是还可以私信嘛!对吧?)

    目录 一.下载软件 二.安装 三.编辑器 四.在Pycharm上成功运行Python程序(配置Python解释器) 一.下载软件 官方下载地址:https://www.python.org/downl ...

  7. uniapp - 超详细录音上传功能,点击开始录音 / 最后保存文件上传到服务器功能(附带详细示例源码及整个过程的实现方法,注释详细小白轻松上手改造)全端兼容!

    效果图 网上的教程太乱用不了,无法改造成自己想要的效果. 在uniapp中开发中,实现点击录音功能,并支持保存录音文件.uniapp编译后全平台兼容通用, 你可以直接复制示例源码,跟着教程一步步配置, ...

  8. Python小白请求大佬们,帮我指明WTF表单错误的解决方法

    https://edu.aliyun.com/lesson_1793_15021#_15021 上面的是我自学的视频网站, 我完全按照视频的代码一步一步敲的, 最终报错,报错信息如下图. 这是回溯: ...

  9. [小白进] 大佬们学习为什么简单?小白该如何学习?学历不高如何找工作?副业很好赚?了解后少走弯路

    一.前言 对于新手来说,最开始学习编程的难度不亚于学天书,那为什么有经验的程序员在接触一门新技术时能够快速的上手并且完成一些需求的开发呢? 有些人可能看了这个问题觉得我在说废话,"有经验那不 ...

  10. 动态规划系列问题—从小白到大佬的入门、进阶之旅!!!

    前言 本篇文章写了将近一万五千字,整理了关于动态规划系列问题的绝大部分分支,包括动态规划的介绍,相关术语等基础内容,也有区间DP,状压DP等进阶知识. 不管你是刚学习该算法的小白,还是对该算法有了一定 ...

最新文章

  1. linux 版本 arch,Arch Linux是什么
  2. arcgis数据文件使用
  3. ie9怎么开兼容模式
  4. 小老板,我学的计算机组成原理告诉我半导体存储器都是断电后丢失的,为什么U盘SSD(固态硬盘)没事呢?
  5. mysql gui 有哪些_推荐五款较好的MySQLGUI工具
  6. python 发送邮件connect none_使用python向IP地址发送邮件
  7. python+selenium方法大全
  8. Java SE 第二十三讲----static关键字and final关键字
  9. Vue.js学习系列(九)---使用路由搭建单页应用(二)
  10. 笔者使用macOS的一些经验点滴记录1
  11. python 读取wifi数据_通过Python实现WiFi测试数据分析
  12. [渝粤教育] 中国地质大学 大学英语(7) 复习题
  13. P4320 道路相遇
  14. 基于深度学习的车型识别APP
  15. 相见恨晚 linux下的c++filt 命令
  16. win的反义词_趣味记忆—小学英语必须掌握的120组反义词
  17. mysql菜单表设计_多级联动菜单的数据库表如何设计?
  18. 2023年直播行业的困境是什么?未来有哪些发展趋势?
  19. 路由器中宽带密码查看
  20. Python面向对象06/反射/双下方法

热门文章

  1. 数电基础知识——原码、反码、补码
  2. idea打包jar包后java运行jar命令提示jar中没有主清单属性的解决方案
  3. 斐讯 K2 路由器 无线中继 无线扩展设置教程图文
  4. 共焦显微镜技术原理、参数及其应用
  5. markdown语法简单而全面,带有源码和图片(10mins内看完)
  6. 鸿蒙系统代还,荣耀智慧屏可以看电视了!华为还是妥协了
  7. 开氏温度与摄氏度换算_8789 单位换算小技巧
  8. 度数换算_度的换算(度数换算计算器)
  9. APP微信小程序测试一览表(常规用例)
  10. 【FAQ】【Push Kit】 华为怎么设置角标