C++ Opencv之图像数据拷贝分析

测试代码C++

cpp 复制代码
#include<iostream>
#include<opencv2/opencv.hpp>

void main()
{
	//cv::Mat A = (cv::Mat_<float>(3, 3) << 1, 0, 0, 0, 1, 1, 0, 0, 1);
	
	int wh = 1200;
	cv::Mat A = cv::Mat(wh, wh, CV_8UC1, cv::Scalar::all(128));
	

	cv::Mat B, C;

#if 1
	auto t0 = cv::getTickCount();
	B = A;
	B.at<float>(1, 1) = 8;
	auto t1 = cv::getTickCount();
	auto t01 = float(t1 - t0) / cv::getTickFrequency() * 1000;
	std::cout << cv::format("直接赋值耗时:%.2f ms\n", t01);


#endif

	t0 = cv::getTickCount();
	C = A.clone();
	C.at<float>(1, 1) = 8;
	t1 = cv::getTickCount();
	t01 = float(t1 - t0) / cv::getTickFrequency() * 1000;
	std::cout << cv::format("图像clone耗时:%.2f ms\n", t01);

	t0 = cv::getTickCount();
	//unsigned char* buffer = new unsigned char[A.rows * A.cols * A.channels()];
	//针对8通道可以,float或者double另行讨论
	cv::Mat D = cv::Mat(A.size(), A.type());
	memcpy(D.data, A.data, A.rows * A.cols * A.channels());
	
	t1 = cv::getTickCount();
	t01 = float(t1 - t0) / cv::getTickFrequency() * 1000;
	std::cout << cv::format("memcpy耗时:%.2f ms\n", t01);

	std::cout << "go!\n";


}
  • 输出:
bash 复制代码
直接赋值耗时:0.00 ms
图像clone耗时:0.76 ms
memcpy耗时:0.51 ms
  • 若把图像大小设为3000,则 差距就很明显了
cpp 复制代码
int wh = 3000;
cv::Mat A = cv::Mat(wh, wh, CV_8UC1, cv::Scalar::all(128));
  • 结果如下:
bash 复制代码
直接赋值耗时:0.00 ms
图像clone耗时:4.84 ms
memcpy耗时:2.53 ms
相关推荐
AI探索派3 分钟前
Agent Teams和Agent Swarm是什么?多Agent协作原理实战拆解
人工智能·架构·agent
wizardpisces6 分钟前
Prompt 堆叠的尽头,是系统设计问题
人工智能
Wang's Blog21 分钟前
Vibe Coding一人即团队系列8: Claude Code 模型选型指南
人工智能
我叫孙一鸣-专注电子元器件22 分钟前
自动驾驶的眼睛正在换代:激光雷达的“小镜子”正在改变未来
人工智能·机器学习·自动驾驶·卫星通讯·压电驱动器
后端小肥肠26 分钟前
开营 10 天变现率 20%:我用一套 Skill,把小红书虚拟资料跑成了可复制流程
人工智能·aigc·agent
格林威36 分钟前
C#图像快速剪切:使用OpenCvSharp和Halcon优化图像剪切和CPU占用
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
远航计算机39 分钟前
GEO自诊断实操手册:你的内容为什么AI搜不到?
人工智能·矩阵·aigc·媒体
richard_first43 分钟前
Transformer 与大语言模型:第6章 Self-Attention自注意
人工智能·深度学习·transformer
深念Y1 小时前
约束工程:如何让 AI 没法跑偏
人工智能·ai·软件工程·codex·opencode·ccsiwtch
赛逸会展s1 小时前
2027赛逸展机器人展新闻发布会在京举行
人工智能·机器人