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
相关推荐
不才不才不不才3 分钟前
Spring AI 实战:聊天、提示词、记忆三件套
java·人工智能·spring·ai
汤姆yu8 分钟前
Anthropic Claude Fable 5 深度解析
人工智能·ai·大模型·智能体·视频模型
JustNow_Man14 分钟前
psmux快捷键
人工智能·python
神奇的小猴程序员21 分钟前
提升 AI 与开发效率!两款实用 Skill 开源工具 FunctionCool-Skill & StyleCool-Skill 深度体验
人工智能·开源·s
哈哈,柳暗花明39 分钟前
人工智能专业术语详解(L)
人工智能·专业术语
莱歌数字1 小时前
散热测试使用恒温热源和功率热源的应用场景分析
人工智能·科技·制造·散热·液冷散热
码农小白AI1 小时前
AI报告审核通审Agent版搭载IACheck:锅炉压力容器电梯起重设备安装监检核查
人工智能
手写码匠1 小时前
手写 GraphRAG:从零实现图增强检索增强生成系统
人工智能·深度学习·算法·aigc
沪漂阿龙1 小时前
Chat Model:LangChain 如何统一调用不同大模型?
人工智能·langchain
庄周迷蝴蝶1 小时前
Vision Banana
人工智能·计算机视觉