网站首页 > 基础教程 正文
前言
之前我写过一篇介绍学习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);
运行结果如下:
猜你喜欢
- 2024-10-19 Python3 datetime模块指南:日期时间操作、时区管理与实战案例
- 2024-10-19 C++及数据结构复习笔记,类和对象很简单?为啥好多程序员还不会
- 2024-10-19 Linux时间和日期 linux 时间 表示方法
- 2024-10-19 C/C++的8种时间度量方式以及代码片段
- 2024-10-19 Python实战:使用 datetime模块处理时间日期的全方位指南
- 2024-10-19 C++编程的 42 条建议(四) c++编程100例
- 2024-10-19 mount with noatime - 合理关闭atime提高服务器性能
- 2024-10-19 linux下连续三次fork()——深度理解进程创建函数
- 2024-10-19 C函数time和clock的计时区别 c计时器函数
- 2024-10-19 win进程弹出Microsoft Visual C++ Runtime Library的解决办法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)