利用文件读写,完成载入图片功能(可以局部的载入)

Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤) 本文详细解析了Visual Studio调试时ntdll.dll的PDB文件缺失问题,提供了3种实用解决方案:调整调试设置、配置符号服务器与缓存目录、手动下载管理符号文件。通过分步指导和高级技巧,帮助开发者快速恢复完整的调试功能,特别适用于Windows平台下的C++项目开发。 阅读详情

本程序源于一个想法,如何将图片直接上传到FTP。能想到的一个可行的方法就是在Ftp站点下新建一个文件,打开文件并传输数据。吸取了OpenCV教程一书例4-4与例4-5及相关知识。本项目由以下两个有机组成部分构成:1、将图像的颜色数据存入文件2、从文件读取要求区域的图像的颜色数据

本项目由以下两个有机组成部分构成:
1、将图像的颜色数据存入文件
2、从文件读取要求区域的图像的颜色数据

 

#include "cxcore.h"
#include 
"highgui.h"
#include 
"stdlib.h"

int main( int argc, char** argv )
{
   
   IplImage
* img = 0;
   img   
= cvLoadImage("20080514150135664.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
   CvFileStorage
* fs = cvOpenFileStorage("example.yml",0 , CV_STORAGE_WRITE);
   cvWrite(fs , 
"Image" ,img , cvAttrList(0,0));
   system(
"PAUSE");
   cvReleaseFileStorage(
&fs);
   cvReleaseImage(
&img);
   
return 0;
}

 

#include <stdio.h>
#include 
<highgui.h>
#include 
"cxcore.h"

int main( int argc, char** argv )
{

   CvSeq
* seq;
   CvSeqReader reader;
   CvPoint point 
= cvPoint(100,100);
   CvSize size 
= cvSize(400,350);
   IplImage
* img = cvCreateImage(size,IPL_DEPTH_8U,3);
   uchar 
*picData ;
   
int step;
   
int channels;
   
   picData 
= (uchar*)img->imageData;
   channels 
= img->nChannels;
   step 
= img->widthStep/sizeof(uchar);
   
    CvFileStorage
* fs = cvOpenFileStorage( "example.yml", 0, CV_STORAGE_READ );
   CvFileNode
* parent = cvGetFileNodeByName( fs, 0, "Image" );

   CvFileNode
* data = cvGetFileNodeByName( fs, parent, "data" );
   CvFileNode
* imgWidth = cvGetFileNodeByName( fs, parent, "width" );
   CvFileNode
* imgHeight = cvGetFileNodeByName( fs, parent, "height" );
    
int width,height;
   width 
= imgWidth->data.i;
   height 
= imgHeight->data.i;
   seq 
= data->data.seq;
   
    cvStartReadSeq( seq, 
&reader, 0 );
   
   
int total = seq->total;
   
int value;
   
int i,j,k;
   
for(i=0;i<size.height + point.y;i++)
   
{
      
for(j=0;j<width;j++)
      
{
         
for(k = 0;k<channels;k++)
         
{
            CvFileNode
* pt = (CvFileNode*)reader.ptr;
            
if(j<size.width+point.x&&j>=point.x&&i>=point.y)
            
{
               value 
= pt->data.i;
               picData[(i
-point.y)*step+(j-point.x)*channels+k]  = value;
            }

            CV_NEXT_SEQ_ELEM(seq
->elem_size, reader );
         }

         
      }

   }

   cvNamedWindow(
"region of image",CV_WINDOW_AUTOSIZE);
   cvShowImage(
"region of image",img);
   cvWaitKey(
0);
   cvReleaseImage(
&img);
   cvDestroyWindow(
"region of image");
   
return 0;
}

 

 example.yml的大体格式如下

 

%YAML:1.0
image: !!opencv-image
   width: 640
   height: 480
   origin: top-left
   layout: interleaved
   dt: "3u"
   data: [ 128, 160, 143, 131, 160, 144, 134, 158, 146, 135, 157, 145,
    ...
    ]

 

虽然程序段很简短,但我也是苦做了一天完成的成果。其间绕了不少弯路,不过也对很多知识点加深了了解。如下:
1、访问图像元素时的坐标(i,j)分别指的是纵坐标和横坐标。与通常的坐标表示习惯不一样。据我的理解,这样做是因为图像数据的读写以origin结构的起始点一行一行来的,所以IplImage的结构才只有widthStep,而没有heighthStep。
2、还有一个有趣的地方就是CV_NEXT_SEQ_ELEM宏的使用
/* move reader position forward */
#define CV_NEXT_SEQ_ELEM( elem_size, reader ) /
{ /
if( ((reader).ptr += (elem_size)) >= (reader).block_max ) /
{ /
cvChangeSeqBlock( &(reader), 1 ); /
} /
}

很显然根据该宏的定义,没有办法随心所欲的移动,受reader结构的block_max所限,一次没有办法移动太大的尺寸。

项目生成的yaml文件大小有4M多,原图像文件90Kb,所以没有实际意义,但是我觉得理论上的意义还是挺大的,这是个雏形,展现了如下诸多可能:
1、可以通过Ftp直接传递应用程序的数据
2、可以将图像存入自定义格式的文件中,并从该自定义文件读取图像(可以局部的载入)
3、其实是由二衍生的具体可能性就是可以局部载入很大的图片,仅仅显示你需要的部分(当然前提是你知道你需要哪部分),大大提高效率(比如地图图像文件,超过10M都是很正常的,很明显如果一次全部载入将会占用很多系统资源)

 

以下是网友回复的意见,摘录于下:

其实你要用ftp传输图像可以分为2步:

1. 将图像作为普通文件下载到本地
2. 读取下载的文件

如果是图像太大,需要读局部区域的图像,可以用GDAL来做。GDAL是专门用来处理
遥感图像的,对于多波段、超大影像都有很好的支持。我过段时间打算将Gdal和OpenCV
结合到一起,抽象一个CvxGdalWrap类,用GDAL完成区域IplImage格式的读写。

最后是本文文件太大的问题。如果图像比较小问题还不太严重。但是如果图像很大的话,
用文本格式可能会生成几十MB甚至几百MB大小的文件。文件太大对于读写的速度会有很大的影响,
对于网络传输的影响更大。

但是如果只是将文本转换为二进制,依然会存在很大的冗余。当然,压缩图像的话会用到很多算法。
因此,最好的方式是用现成的图像库,直接把图像保存为png或jpg等压缩格式。

                                                      -----------chai2010

Python 爬取网页文字并保存为 txt 文件教程 将要爬取的网页网址赋值给变量url。 阅读详情

相关推荐

3D slicer查看形变场

3Dslice显示数据和形变场 将需要可视化的数据也导入3Dslice,注意描述为volume(图1a),如果没有显示是因为路径中不能有中文,也就是moving图像。 (b) 图1、数据导入形变场和 将相应的形变场数据直接拖入3Dslice,并修改描述为形变场(图1b)。 点击transform菜单图2(a),然后勾选形变场可视化图2(b)。 (b) 图2...

fanre的专栏 1947

OpenCv中基于决策树的分类任务代码解读(二)

/***************************************************************************************************************** 文件说明: OpenCv中,决策树训练程序的分析 开发环境: Vs2012+OpenCv2.4.9+Win10 时间地点:

maweifei的博客 1213

洪水风险图制作全流程:HEC-RAS 与 ArcGIS 的耦合应用

本文系统介绍HEC-RAS水动力模拟软件在水利工程中的应用技术。内容涵盖:1)软件理论与安装;2)一维地形数据导入与河网构建;3)恒定流/非恒定流计算及模型调试要点;4)构筑物建模技术(桥梁、堰闸等);5)二维水动力模拟与溃坝分析;6)洪水风险图绘制。重点讲解水面线调试、糙率选取、报错分析等实操难点,通过案例教学实现从基础到工程应用的全流程技术掌握。该培训适用于防洪评价、河道治理等水利工程数值模拟需求。

2403_89974123的博客 1053

学习OpenCV——Surf(特征点篇)&flann

Surf(Speed Up Robust Feature) Surf算法的原理                                                                            1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度。S

小熊不去实验室 5万+

Ubuntu系统下主板GPU温控pwm风扇

在Linux系统下——以Ubuntu为例,配置主板sys_fan等接口连接pwm温控风扇转速根据NVIDIA GPU温度,为服务器GPU等无主动散热显卡提供散热。

罗思哲的博客 5034

向量数据库:PGVector

PGVector 是一个基于 PostgreSQL 的扩展插件,为用户提供了一套强大的向量存储和查询的功能

m0_37559973的博客 1万+

OpenCV检测矩形

代码来自www.opencvchina.com #ifdef _CH_ #pragma package <opencv> #endif #ifndef _EiC #include "cv.h" #include "highgui.h" #include <stdio.h> #include <math.h> #include <string.h&g...

苦逼的程序猿 4463

智能座舱语音测试避坑指南:从唤醒率到方言识别,这些场景你测全了吗?

本文深入解析智能座舱语音测试的关键场景与避坑指南,涵盖唤醒率测试、方言识别、多音区交互等复杂场景。通过实战案例与自动化测试方案,帮助开发者全面提升语音系统的可靠性与用户体验,特别关注环境噪声干扰与方言覆盖策略。

weixin_42613501的博客 497

【opencv+C++】在图像中找四边形

【opencv+C++】在图像中找四边形 转载 2014年11月15日 14:02:40 1562 [cpp] view plain copy /*  这个程序的基本思想是:对输入的图像进行滤波去掉噪音,然后进行canny边缘检测,之后进行膨胀,然后寻找轮廓,对轮廓进行多边形的逼近,检测多边形的点数是否是4而且各个角

无敌三脚猫的专栏 3374

数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟

本文介绍了连续图像和数字图像直方图匹配(直方图规定化)的原理、处理过程,并提供了案例进行了讲解。可以看到,直方图均衡处理是直方图匹配的一个重要桥梁。 最后,对于直方图规定化这个翻译个人觉得很low,个人感觉叫指定直方图更好理解,但Histogram Specification怎么翻译确实不太好把握,因此还是叫Histogram Matching直方图匹配最好。

老猿Python 2880

(四) OpenClaw-Skill技能全面了解和自定义技能

OpenClaw Skills是提升AI代理功能性的关键模块。本文系统介绍了Skills的核心概念、获取渠道和创建方法。Skills作为标准化指令集合,能让OpenClaw从单纯理解升级为实际执行任务,相比传统System Prompt具有模块化、可复用等优势。用户可通过Clawhub官方商店、GitHub社区等渠道获取5700+现成技能,或按需开发自定义Skill。文章详细演示了创建"Hello World"示例技能的完整流程,包括编写Python脚本、配置SKILL.md文件、部署。

直到世界的尽头 8296

OpenCV的序列数据结构(CvSeq)

序列是内存存储器中可以存储的一种对象.序列是某种结构的链表.OpenCV中,序列可以存储多种不同的结构.你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).学列在内存被实现为一个双端队列(deque).因此序列可以实现快速的随机访问,已经快速删除顶端的元素,但是从中间删除元素则稍慢些. 1.数据结构 seq数据结构如下 查看文本打印 #define CV...

hanxiaoyong_的博客 656

Dify 第 19 篇 手把手教你开发 Dify 插件:从零实现一个时间工具

本文介绍了Dify平台的插件开发机制和流程。Dify支持多种插件类型,包括模型、工具、数据源等,可通过CLI工具快速开发插件。文章详细讲解了如何安装Dify CLI工具,并演示了从零开发一个获取系统时间插件的完整过程,包括项目初始化、文件解读和打包部署。通过该教程,开发者可以快速掌握Dify插件开发的核心要点,实现自定义功能扩展。

甘蓝的专栏 2451

mysql数据写入磁盘的原理_硬盘的读写原理

"数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。"下边是我的一些摘录,想大概看时就看这个,想看详细的就看上边这个啦。对...

weixin_35734209的博客 1373

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

磁盘和内存读写简单原理

当程序要读取的数据时传入内存地址(行地址+列地址),如果数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,通过柱面号,磁头号,扇区号定位磁盘位置,找到数据的起始位置并向后连续读取一页或几页载入内存中。 我们在程序中的数据处理主要是操作磁盘和内存,硬盘是磁盘里面最常用的一种.以前有所谓的软盘,也是磁盘的一种,原理和硬盘是一样的.都是利用磁性物质的特性来保存信息.磁盘的原理...

weixin_42022668的博客 3479

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

磁盘读写的简单原理

转发:https://blog.youkuaiyun.com/zhanghongzheng3213/article/details/54141202/ 当程序要读取的数据时传入内存地址(行地址+列地址),如果数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,通过柱面号,磁头号,扇区号定位磁盘位置,找到数据的起始位置并向后连续读取一页或几页载入内存中。 我们在程序中的数据处理...

jiangbinbin的博客 4790

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

!!!!!!!! 硬盘的读写原理 !!!!!!!!

tips:看了MySQL索引背后的数据结构及算法原理后,里边有说: "数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。...

m0_37477061的博客 306

磁盘的读写原理

"数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。" 然后就不懂了页是什么意思,就看了这篇关于硬盘的超详细解释:http...

weixin_33885676的博客 177

硬盘的读写原理

在1956年IBM的一个工程小组向世界展示第一台磁盘存贮系统Ramac,1968年Winchester技术被提出,硬盘走过了50年的历程,虽然硬盘技术上有很多的进步,衍生出了SCSI、IDE、SATA等多种不同的形式,那只是为了适应新的应用需要开发的不同接口而已,硬盘的结构依然没有超越Wenchester技术的定义:密封、固定并高速旋转的镀磁盘片,磁头延盘片向径移动,磁头悬浮在高速旋转的盘片上方而

u010233323的博客 829
上一篇: 面试的一道机试题: 排序 难度(**)
下一篇: vector动态二维数组
soliddream66
博客等级 码龄19年 93粉丝 65原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值