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
相关推荐
镜象科技1 分钟前
职业院校AI心理健康解决方案是什么?从一台设备到全周期守护
android·人工智能
把我格子衫拿来2 分钟前
RANSAC 粗配准:离群点很多时,怎样为 ICP 找到可信初值?
python·计算机视觉·三维重建·ransac·点云配准
愤怒的代码3 分钟前
模型量化为什么几乎不损失精度:误差的四道防线
人工智能
YoLo♪8 分钟前
PicGo OpenHarmony PC 适配说明
人工智能·机器人·交互
Web3&Basketball8 分钟前
决策模型vs GPT-5实测:便宜400倍
人工智能·python·gpt·大模型·ai落地·推理优化·决策模型
zzu123zsw9 分钟前
从 Copilot 中间人切换到自主工程执行体:Block 开源 AI 研发智能体 Goose 的 Rust 微内核与 MCP 扩展实践
人工智能·开源·copilot
Mars-xq10 分钟前
家庭膳食营养速查表
大数据·人工智能
围炉聊科技12 分钟前
从一次36分钟的翻盘学习DSH是怎么做 Loop Engineering的——智能体基建系列
人工智能
java资料站13 分钟前
十五、Spring AI Alibaba · 高级 ·Graph
java·人工智能·spring
明志数科17 分钟前
具身智能机器人从演示验证到常态化部署的工程差距分析
人工智能·机器人