前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV4 C++开发筑基之数据转换

OpenCV4 C++开发筑基之数据转换

作者头像
OpenCV学堂
发布2024-03-07 10:28:15
780
发布2024-03-07 10:28:15
举报

前言

之前我写过一篇介绍学习OpenCV C++一些前置基础C++11的基础知识,主要是介绍了输出打印、各种常见数据容器。这里又整理了一篇,主要涉及各种数据类型之间的相互转换。用C++写代码,特别是写算法,很多时候会遇到各种精度的数据相互转换、显示的时候还会遇到不同类型变量相互转换,因此个人总结了一下,主要有以下三种常见的数据转换

01、数据高低精度转换

最常见的就是int类型转float或者是float转int,而C++语言默认的自动转型有时候带来意向不到的大BUG。所以最好采用显式的强制转型方式比较好。推荐使用static_cast,它是C++ 中四个命名强制类型转换操作符之一,经常被用于基础数据类型转换,非常好用。

想把输入图像512x512的缩放到300x300,先计算缩放:

代码语言:javascript
复制
cv::Mat image = cv::imread("D:/images/lena.jpg");
int w = image.cols;
int h = image.rows;
std::cout << " width: " << w << std::endl;
std::cout << " height: " << h << std::endl;
float sx = w / 300;
float sy = h / 300;
std::cout << " sx: " << sx << " sy: " << sy << std::endl;

运行结果如下:

必须先把w跟h强制转型为float,代码修改如下:

代码语言:javascript
复制
cv::Mat image = cv::imread("D:/images/lena.jpg");
float w = static_cast<float>(image.cols);
float h = static_cast<float>(image.rows);
std::cout << " width: " << w << std::endl;
std::cout << " height: " << h << std::endl;
float sx = w / 300;
float sy = h / 300;
std::cout << " sx: " << sx << " sy: " << sy << std::endl;

我们都知道这种情况下计算出来的缩放比例,sx跟sy应该是浮点数,但是如果这个时候左侧默写都是int类型,直接这样计算就导致了先会生成int类型的结果,然后再转float,这点跟python语言语法不同,所以得到的sx跟sy都等于,运行结果如下:

这个时候计算就正确了,所以推荐基本数据类型转换用static_cast 显式完成。

02、数值转换

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

  • std::to_string 这个是万能的,我写出了C#与Java的既视感!
  • atoi 转化为整数int类型
  • atof 转换为浮点数float类型

代码演示如下:

代码语言:javascript
复制
// 各种字符与数值转换
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函数,使用如下:

代码语言:javascript
复制
int a1 = 100;
float f8 = 20;
float sum = std::max(static_cast<float>(a1), f8);

03、wchar与char转换为std::string

网上有各种C++语言的wchar与char如何转换为std::string的例子,但是我个人最喜欢或者推荐用的基于C++标准函数的接口转换,简单快捷有效。wchar转std::string 方法如下:

代码语言:javascript
复制
// wchar转std::string
std::wstring wstxt(wchar_txt);
std::string strtxt(wstxt.begin(), wstxt.end());

char转std::string 方法

对于char或者其它数值类型转换为std::string类型,推荐使用字符流对象ostringstream ,这个简直是太好用,代码如下:

代码语言:javascript
复制
std::ostringstream ss;
std::wstring wstxt(wchar_txt);
std::string strtxt(wstxt.begin(), wstxt.end());
ss << char_buff;
ss << "-";
ss << "your text content";
ss << "-";
ss << strtxt;
std::cout << ss.str() << std::endl;

总结:数值到字符串转换记住std::tostring 与ostringstream 就万事可成!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 01、数据高低精度转换
  • 02、数值转换
  • 03、wchar与char转换为std::string
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档