微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
前言
01
数据高低精度转换
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;
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;
这个时候计算就正确了,所以推荐基本数据类型转换用static_cast 显式完成。
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
wchar与char转换为std::string
// wchar转std::string
std::wstring wstxt(wchar_txt);
std::string strtxt(wstxt.begin(), wstxt.end());
char转std::string 方法
对于char或者其它数值类型转换为std::string类型,推荐使用字符流对象ostringstream ,这个简直是太好用,代码如下:
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 就万事可成!
推荐阅读
OpenCV4.8+YOLOv8对象检测C++推理演示
总结 | OpenCV4 Mat操作全接触
三行代码实现 TensorRT8.6 C++ 深度学习模型部署
实战 | YOLOv8+OpenCV 实现DM码定位检测与解析
对象检测边界框损失 – 从IOU到ProbIOU
YOLOv8 OBB实现自定义旋转对象检测
初学者必看 | 学习深度学习的五个误区
YOLOv8自定义数据集训练实现安全帽检测