点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自|OpenCV学堂

前言

之前我写过一篇介绍学习OpenCV C++一些前置基础C++11的基础知识,主要是介绍了输出打印、各种常见数据容器,这里又整理了一篇,主要涉及时间计算与格式化输出、各种数据类型之间的相互转换、简单的定义方法与泛型方法定义使用。

01

时间计算与转换

很久以前我写过一篇OpenCV中如何计算程序执行时间的文章,这个一直有效,链接如下:

https://mp.weixin.qq.com/s/CRzViZv8wY3PQ2uN70AtSA

这里我们使用C++11,同样可以计算,而且C++11还支持各种日期与系统时间的格式化输出,主要是基于std::chrono包的各种函数应用,这部分的代码演示如下:

std::cout << "Hello World, C++" << std::endl;
// 毫秒
std::chrono::milliseconds ms(3);
std::cout << ms.count() << std::endl;
// 转换为微秒
std::chrono::microseconds us = ms * 2;
std::cout << us.count() << std::endl;
// 计算执行时间
auto t1 = std::chrono::system_clock::now();
cv::Mat src = cv::imread("D:/images/test.png");
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
auto t2 = std::chrono::system_clock::now();
std::cout <<"毫秒数:"<<std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() <<" 微秒数:"<< std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() <<" 秒数:" << std::chrono::duration_cast<std::chrono::seconds>(t2 - t1).count() << std::endl;// 计算当前时间与日期
auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::cout << "Current Time: "<<std::put_time(std::localtime(&t), "%Y-%m-%d %H.%M.%S")<< std::endl;

运行结果如下:

支持毫秒、微秒、秒、支持获取系统的当前时间等。

02

数值转换

在OpenCV编程开发中,有时候会读取数据文件,需要把数据从字符(string)类型转为数值(number)类型,常见的有int、float、double、long等类型与string类型的相互转换,这部分的转换主要依赖函数:

  • std::to_string 这个是万能的,我写出了C#与Java的既视感!

  • atoi 转化为整数int类型

  • atof 转换为浮点数float类型

代码演示如下:

// 各种字符与数值转换
double d = 1.234;
float f = 3.145;
int i = 314;
long l = 22;
std::cout << std::to_string(d) << std::endl;
std::cout << std::to_string(f) << std::endl;
std::cout << std::to_string(i) << std::endl;
std::cout << std::to_string(l) << std::endl;// 从string到数值
const char* str1 = "3.2333";
const char* str2 = "5.321";
float f1 = std::atof(str1);
float f2 = std::atof(str2);
float f3 = f1 + f2;
std::cout << f3 << std::endl;const char* str3 = "100";
const char* str4 = "121";
int i3 = std::atoi(str3) + std::atoi(str4);
std::cout << i3 << std::endl;

运行结果如下:

此外各种数值类型相互转化,主要依赖static_cast函数,使用如下:

int a1 = 100;
float f8 = 20;
float sum = std::max(static_cast<float>(a1), f8);

03

简单的泛型应用

有时候你看到一些C++的代码中会有template<typename  T>类似的语法,很多小白都直接蒙了,其实这个是现代编译器支持,各种语言都会有的泛型。说白了就是运行期识别。先定义个,到时候传什么类型就是什么类型。OpenCV中的图像数据常见支持uchar与float类型操作,我们以此为例定义一个泛型函数,实现浮点数与字节类型图像数据的遍历与操作,方法定义与代码实现如下:

template <typename T>
void pixel_visit_demo(cv::Mat& src, cv::Mat& dst) {// 指针读取int height = src.rows;int width = src.cols;int ch = src.channels();int blue = 0, green = 0, red = 0;int gray;for (int row = 0; row < height; row++) {T *curr_row = src.ptr<T>(row);T *result_row = dst.ptr<T>(row);for (int col = 0; col < width; col++) {if (ch == 3) {blue = *curr_row++;green = *curr_row++;red = *curr_row++;*result_row++ = 255 - blue;*result_row++ = 255 - green;*result_row++ = 255 - red;}else if (ch == 1) {gray = *curr_row++;*result_row++ = 255 - gray;}}}
}

调用该方法实现浮点数与字节类型的Mat对象操作代码如下:

// 泛型,处理不同类型的图像数据imshow("输入图像", src);Mat dst = Mat::zeros(src.size(), src.type());pixel_visit_demo<uchar>(src, dst);imshow("result-uchar", dst);// 处理浮点数图像数据src.convertTo(src, CV_32F);dst.convertTo(dst, CV_32F);pixel_visit_demo<float>(src, dst);imshow("result-float", dst/255.0);waitKey(0);

运行结果如下:

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

OpenCV4 C++学习 必备基础语法知识二相关推荐

  1. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  2. php基础语法知识笔记(一)

    共享一份我自己学习php基础语法知识的笔记,这是第一弹,明天共享第二弹. 1.判断php短标记<??>是否适用,查看php配置文件php.ini中的"short_open_tag ...

  3. 第二章:python必备基础语法

    文章目录 第二章 python必备基础语法 一.变量 1.1 什么是变量?有什么用处? 1.2 如何声明一个变量(即定义变量)? 1.3 变量的命名规则及风格 1.4 变量值的三大特性 作业: 1.5 ...

  4. Vue基础语法知识(自用,完整版)

    Vue基础语法知识 1.想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象 2.root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法 3.root容器中里的代码被称为 ...

  5. Java基础语法知识你真的都会吗?

    第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...

  6. 0基础学习Python基础语法(0)-print()与变量

    文章目录 Python[人工智能]时代的立身武器 print 无引号 单引号的用法 双引号的用法 三引号的用法 转义字符 变量和赋值 变量的命名规范 下关预告 Demo 例子:打印 例子:转义字符 要 ...

  7. python基础语法有哪些-Python基础语法知识有哪些?

    相信大家都听过Python除了不会生孩子,基本上无所不能的段子,这一定程度上反映了目前Python编程语言的火爆程度和广泛应用.然而,对于许多零基础的Python学习者来说,常常会遇到无从学起,找不到 ...

  8. idea编译的文件怎么用cmd打开_JAVA学习册|基础语法|cmd输出HelloWorld

    看到这个标题,估计已经有小伙伴知识本文要讲什么了,好,下面我们就开始正文 学java最开始的地方 很多老师的书和视频中,在安装完jdk,配置好环境变量,都会带大家用记事本写一个HelloWorld,然 ...

  9. Python基础语法知识3

    文章目录 1.序: 2.输入函数input() 3.Python中的运算符 3.1 算术运算符 3.2 赋值运算符(=) 3.3 比较运算符 3.4 布尔运算符 3.5 位运算符中的左右运算符 1.序 ...

最新文章

  1. MCtalk教育快报 | 0827
  2. 数据集成之主数据管理(转载整理)
  3. max日期最大值为0_excel函数技巧:MAX在数字查找中的应用妙招
  4. 知乎:学计算机的女生都怎么样了?
  5. 镜像VirtualBox 下安装 CentOS 7搭建python项目
  6. c语言表达式10 amp 6等于多少,C语言基础——表达式
  7. 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件
  8. 建立项目接口文档_分享:一步一个脚印,vue入门之使用mockjs搭建vue项目测试服务器...
  9. php输出多行多列,数据库查询记录php 多行多列显示
  10. python找不到指定文件夹_python找不到指定文件
  11. Spring boot 2.0 with Oauth2 + Jwt
  12. 霍夫线变换,霍夫圆变换
  13. java-Web(js)作业
  14. 分享5个宝藏文字转语音配音软件,错过太可惜
  15. 基于WDF框架的PCIE驱动设计
  16. 一个假猪套神器:NET CAT-NC
  17. 用python给pdf批量添加水印,并给pdf加密
  18. 用pdfminer把PDF文件转化为文本文件
  19. winform pdf转图片.jpg或.png(O2S.Components.PDFRender4NET)
  20. 互联网早报:京东健康宠物医院上线:注册医生超3000名 提供7X24在线健康咨询服务

热门文章

  1. Python编写循环的两个建议 | 鹅厂实战
  2. 拯救老电影——详解爱奇艺ZoomAI视频增强技术的应用
  3. 叫你一声“孙悟空”,敢答应么?
  4. AI当红娘,真的能帮你摆脱单身吗?
  5. “打脸”世界杯:AI界没有预测比赛的章鱼保罗
  6. 春节囤货清单 | 15篇近期值得读的AI论文
  7. Linux 进程必知必会
  8. 常用的设计模式汇总,超详细!
  9. 聊聊 SpringCloud 中的父子容器
  10. 数据可视化教程来了!