DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

        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);
 
}
 
 

 

 
posted on   DoubleLi  阅读(389)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-08-22 Windows10/11 三步安装wsl2 Ubuntu20.04(任意盘)
2022-08-22 win10离线安装WSL2 Ubuntu20.04系统
2016-08-22 insmod module_param 模块参数
2013-08-22 C++的四种cast操作符的区别--类型转换
2013-08-22 __stdcall,__cdecl,_cdecl,_stdcall,。__fastcall,_fastcall 区别简介
2013-08-22 cdecl、pascal、stdcall、fastcall
2012-08-22 VC中动态添加控件
点击右上角即可分享
微信分享提示