opencv加载内存中图片

本文详细介绍了如何使用OpenCV从内存中加载图片,并进行解码、编码及区域截取操作,提供了一种高效处理网络上传图片的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        opencv从磁盘加载一张图片非常简单,通过cv::imread即可,代码如下:

	cv::Mat src_mat = cv::imread("1.jpg"); //读取图片1.jpg,imread会将图片内容解码成yuv或rgb存放到Mat对象
	cv::Mat dst_mat = src_mat(cv::Rect(100, 100, 1600, 900)); //获取图片固定区域的内容
	std::vector<uchar> jpg_buff;
	bool ret = cv::imencode(".jpg", dst_mat, jpg_buff);//对固定区域的内容重新进行jpg编码,生成jpg图片,存入jpg_buff
	FILE *file = fopen("2.jpg", "wb");
	if (file != nullptr) {
		fwrite(jpg_buff.data(), 1, jpg_buff.size(), file); //将jpg图片写入内存
		fclose(file);
	}

        然而,很多情况,程序需要从内存中加载图片,例如通过网络上传的图片。很显然,这样的图片不能写入磁盘,然后再通过cv::imread读取,效率太低了。因此,需要从内存直接加载。然后通过cv::imdecode将图片解码成cv::Mat,代码如下:

	FILE *file = fopen("1.jpg", "rb");
	uchar *mem_pic = nullptr;
	long size = 0;
	if (file != nullptr) {
		fseek(file, 0, SEEK_END);
		size = ftell(file);
		fseek(file, 0, SEEK_SET);
		mem_pic = new uchar[size];
		fread(mem_pic, 1, size, file);
		fclose(file);
	}

	cv::_InputArray pic_arr(mem_pic, size);
	cv::Mat src_mat = cv::imdecode(pic_arr, CV_LOAD_IMAGE_COLOR);
	cv::Mat dst_src = src_mat(cv::Rect(100, 100, 1600, 900));
	std::vector<uchar> pic_buff;
	bool ret = cv::imencode(".jpg", dst_src, pic_buff);
	file = fopen("3.jpg", "wb");
	if (file != nullptr) {
		fwrite(pic_buff.data(), 1, pic_buff.size(), file);
		fclose(file);
	}

        cv::_Array还可以使用std::vector代替,代码如下:

	FILE *file = fopen("1.jpg", "rb");
	uchar *mem_pic = nullptr;
	long size = 0;
	if (file != nullptr) {
		fseek(file, 0, SEEK_END);
		size = ftell(file);
		fseek(file, 0, SEEK_SET);
		mem_pic = new uchar[size];
		fread(mem_pic, 1, size, file);
		fclose(file);
	}

	//cv::_InputArray pic_arr(mem_pic, size);
	std::vector<uchar> pic_vec(mem_pic, mem_pic + size);
	cv::Mat src_mat = cv::imdecode(pic_vec, CV_LOAD_IMAGE_COLOR);
	cv::Mat dst_src = src_mat(cv::Rect(200, 200, 400, 225));
	std::vector<uchar> pic_buff;
	bool ret = cv::imencode(".jpg", dst_src, pic_buff);
	file = fopen("3.jpg", "wb");
	if (file != nullptr) {
		fwrite(pic_buff.data(), 1, pic_buff.size(), file);
		fclose(file);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值