百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

OpenCV4 C++学习 必备基础语法知识二

bigegpt 2024-09-09 01:13 7 浏览

#技术派的书架#

前言

之前我写过一篇介绍学习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);

运行结果如下:

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...