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
相关推荐
Cosolar4 分钟前
LlamaIndex 索引类型进阶:构建高性能 RAG 系统的核心能力
人工智能·开源·全栈
人工智能AI技术13 分钟前
【VibeCoding系列教程11】 AI智能体平台
人工智能
wing9813 分钟前
我的AI编程体验:从白嫖到付费,我为什么最终留下了Codex
前端·人工智能·程序员
YOLO数据集集合15 分钟前
智慧林业无人机巡检 松材线虫病害树木实例分割数据集 | 森林枯木识别 深度学习视觉
人工智能·深度学习·目标检测·计算机视觉·无人机
听你说3224 分钟前
深耕具身智能,亿达科创智能四足仿生机器人亮相沈阳机器人大会
人工智能·机器人
前端的阶梯24 分钟前
Cursor 开发 Python 项目完全指南
前端·人工智能·后端
Linlingu24 分钟前
OpenClaw接入阿里云百炼模型配置教程(完整可落地)
人工智能·阿里云·云计算·办公自动化·数字员工·小龙虾
CTA量化套保25 分钟前
Jupyter Notebook 反复运行天勤策略内存涨:close 与内核习惯
ide·人工智能·python·jupyter
不懂的浪漫34 分钟前
AI 时代还需要买课吗?我用 Skills + Markdown + HTML 搭了一套自学系统
前端·人工智能·html·skill
愚公搬代码36 分钟前
【愚公系列】《移动端AI应用开发》017-Android端应用开发(网络通信与API集成)
android·人工智能