1、目录不对,这个你指定一下就OK,比如"C:\\abcd.txt"
2、权限错误,这个一般发生在Windows 7、Windows Vista、Linux,由于你的程序没有权限写入到需要写入的目录中。但是这种情况ofp在fopen会得到NULL。
3、其他错误,磁盘满……,见过好几种不同的情况,但是太少见,估计你遇不到
4、不知道你用的什么系统,一般地,fopen如果出错,perror一下就可以知道什么错误
5、如果fopen没有出错,指定目录也找不到,你可以继续问我
随着计算机和网络的高速发展,计算机机群化,网络广域化,人们已经不再局限在一台计算机,局限在一个地点办公,而是多台计算机、多地点同时办公,这样就要采用远程控制和远程机群管理。现在有一些软件实现的远程控制,但是只能控制一台机器,而且受到 *** 作系统的限制。本文中提出了实现远程控制的硬件方法。 在实现过程中,最为主要的部分就是视频信号的传输问题。若要实现远程控制,就要把视频信号数据经过网络传输到控制端主机,因此要把视频模拟信号数字化,也就是模数变换。我们必须保证图像清晰度和分辨率,这样模数变换后的数据量就会很大,我们就不得不考虑网络传输能力的问题。当然局域网内部传输速度很快,但是我们要做到可以在Internet上传输,就面临着数据的压缩问题。1 视频信号数据压缩算法原理介绍
对数据压缩有好多方法,按照能否完全恢复到原来数据的情形来分有2种,即有损压缩和无损压缩。有损压缩比如JEPG压缩,一张位图被压缩成JPEG格式的过程中会丢掉一些数据,这样在解码的时候就不能恢复到原来的那张位图了。而无损压缩,以LZ,LZ77,LZW为代表,压缩前后的数据没有损失。
1.1 LZ77压缩算法
LZ77算法是无损压缩算法中的一种,采用词典编码思想,在词典中查找最大匹配字符串来实现压缩,具有快速解压缩和内存消耗小的特点而被广泛采用。现在用得很多的Gzip也是采用LZ77方案的。
LZ77数据编解码原理的算法如图1和图2所示。
1.2 JPEG压缩的算法核心DCT〔1〕
JPEG压缩过程如图3所示。
在JPEG压缩算法中通过离散余弦变换DCT(Discrete Cosine Transformation)去除数据冗余,来达到压缩数据的目的。JPEG采用8×8子块的二维离散余弦变换算法:
DCT变换后矩阵内的某个数值,u,v代表DCT变换后矩阵内某个数值的坐标位置。Syx代表图像数据矩阵内的数个数值,y,x代表图像数据矩阵内某个数值的坐标位置。
2 实验环境
实验中采用的是德州仪器(TI)公司的DSP产品TMS320C6000中64系列。从64系列DSP的特点来看适合于高速图像压缩。这种定点DSP内核电压为1.2 V左右,工作频率可达500/600/720 MHz,这样每秒可以执行4000/4800/5760条指令(MIPS)。这种芯片支持那些既要求高性能、高可编程性,又要求低功耗、低价位应用的快速开发。除了高速内核还有一个64信道增强型直接存储器存取Enhanced Direct-Memory-Access(EDMA)能够实现高效输入/输出(I/O);1个16 b和1个64 b外部存储器接口(EMIF)用于高带宽存储器存取;3个多通道缓冲串口McBSP;2个32 b计时器能够记录外部事件;1个HPI(16/32 b)主机接口;1个16 b通用输入/输出(GPIO)引脚,经编程可生成不同CPU中断和EDMA事件。另外6416还有Turbo Decoder Coprocessor(TCP),ViterbiDecoder Coprocessor,UniversalTestand Operations PHYInterface for ATM(UTOPIA)。
我们可以利用VLIW超长指令集结构。VLIW是一种非常适合图像压缩处理等多媒体应用的结构,他支持指令级并行性,这就使得采用他的DSP可以在单时钟周期内执行多项 *** 作。TI公司提供了可变长度解码和离散余弦变换等图像、视频编解码中固有的算法的汇编语言函数库,从而加快算法的运行,缩短数据压缩时间。
FPGA也可以作JPGE压缩,但是JPEG压缩属于分割及区域特征提取等不同层次、不同种类的处理。其中有的运算本身结构比较简单,但是数据量大、计算速度要求高。在实时信号处理系统中,低层的信号预处理算法处理的数据量大,对处理速度的要求高,但原理框图如图4所示(参考TI的第三DSP方开发公司Ateme公司的IEK(Imaging Evaluation Kit))。
FPGA与DSP,DSP与ARM之间用的是FIFO,逐次地发送和提取。
第一步:AD采样,FPGA控制什么时候采样和采样频率等,执行时间T1。
第二步:FPGA向FIFO1发数据,(此时AD在采样,直到一张图像)数据满了,同时DSP提取数据(DSP会启动DMA把数据送到SDRAM中,直到一张图像)执行时间T2。
第三步:DSP进行JPEG压缩,压缩后的数据也在同一SDRAM中,执行时间T3。
第四步:DSP向FIFO2发数据,FIFO满了之后ARM从中提取数据,并发送执行时间T4。
3 实验中的关键问题
3.1 JPEG代码优化
JPEG代码使用了第6版,由Thomas G.Lane.编写JPEG组织提供。如1.2所述,JPEG压缩的核心部分是DCT,他占用了大部分压缩时间,所以要对他进行优化处理来提高效率。这里TI(Texas Instruments)公司提供了图像处理的函数库,在本文中采用62x系列的IMGLIB函数库来仿真,调用了其中的离散余弦变换函数IMG_fdct_8x8()〔2〕。IMG_fdct_8x8()函数采用TI公司DSP汇编语言来实现的,程序代码大小为1 216 B,运行一个8×8DCT只需208个cycles。
比较结果如表1所示(769kB位图)
3.2 CCS(Code Composer Studio)仿真的内存问题
图像处理的时候需要比较大的内存空间,这里包括程序空间,数据空间都要很大,一张位图就近1 M左右,所以在仿真的时候就有内存分配问题。程序里面要有专门管理内存的函数,其他函数要通过他来申请内存,使用之后还要释放内存。对于DSP片上和片外的实际内存分配来说,TI公司的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。我们可以通过编写链接命令文件(.cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。在命令文件中使用2个十分有用的伪指令Memory和Sections,来指定实际应用中的存储器结构和进行地址的映射。Memory用来指定目标存储器结构,Sections用来控制段的构成与地址分配。同时我们要注意,Build Option菜单里面的Heap和Stacksize的规定,一般来说要规定的相对大一些,防止出现内存溢出问题。
4 试验结果
4.1 DSPLZ压缩测试
压缩85.1 kB的BMP图像(再大的图像需要更长的模拟时间,10 min以上或更长)DSPCPU时钟周期是40 ns,25 MHz。压缩比较结果如表2所示。
4.2 DSP和PIIICPU的JPEG数据压缩比较
TI(Texas Instruments)公司提供了DSPTMS320C6x系列的开发仿真软件CCS2.10(CodeComposer Studio 2.10)。CCS有良好的C语言开发环境,C语言编译器和优化器,还有profile控件可以测出程序中每个函数的执行时间。在VC环境下JPEG代码的运行时间可以通过以下2个函数确定QueryPerformance Counter(&t),Query PerformanceFrequency(&f),这2个函数是VC提供的仅供Windows使用的高精度时间函数,并要求计算机从硬件上支持64位高分辨率性能计数器。
结果如表3所示(压缩对象:图像大小769 kB,1024×768)。
注明:在CCS环境下,使用代码优化之后速度可以提高2倍左右。
5 结 语
对于TI公司的TMS320C6000系列的DSP,JPEG的核心算法离散余弦变换有固定的函数库可以有效实现,所以JPEG的压缩速度很快,这样在远程控制端的图像更新速度很容易就可以满足要求。而LZ77压缩算法相比较而言,就不适合于用DSP来压缩,因为他没有用到DSP所具有的特性,因此压缩速度很慢,这样从刷新速度的角度来看,尽管他的压缩图像不失真,但不适合应用于远程控制的应用。从而确定了一种比较好的视频信号压缩问题的解决方案。
JPEG格式JPEG也是常见的一种图像格式,它由联合照片专家组(Joint Photographic Experts Group)开发并以命名为%26quotISO 10918-1%26quot,JPEG仅仅是一种俗称而已。JPEG文件的扩展名为.jpg或.jpeg,其压缩技术十分先进,它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像质量。
同时JPEG还是一种很灵活的格式,具有调节图像质量的功能,允许你用不同的压缩比例对这种文件压缩,比如我们最高可以把1.37MB的BMP位图文件压缩至20.3KB。当然我们完全可以在图像质量和文件尺寸之间找到平衡点。
由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。
四、JPEG2000格式
JPEG 2000同样是由JPEG 组织负责制定的,它有一个正式名称叫做%26quotISO 15444%26quot,与JPEG相比,它具备更高压缩率以及更多新功能的新一代静态影像压缩技术。
JPEG2000 作为JPEG的升级版,其压缩率比JPEG高约30%左右。与JPEG不同的是,JPEG2000 同时支持有损和无损压缩,而 JPEG 只能支持有损压缩。无损压缩对保存一些重要图片是十分有用的。JPEG2000的一个极其重要的特征在于它能实现渐进传输,这一点与GIF的%26quot渐显%26quot有异曲同工之妙,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的 JPEG 一样,由上到下慢慢显示。
此外,JPEG2000还支持所谓的%26quot感兴趣区域%26quot特性,你可以任意指定影像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。 JPEG 2000 和 JPEG 相比优势明显,且向下兼容,因此取代传统的JPEG格式指日可待。
JPEG2000可应用于传统的JPEG市场,如扫描仪、数码相机等,亦可应用于新兴领域,如网路传输、无线通讯等等。
-------
JPEG(Joint Photographic Experts Group) 是一个由 ISO和IEC两个组织机构联合组成的一个专家组,负责制定静态的数字图像数据压缩编码标准,这个专家组开发的算法称为JPEG算法,并且成为国际上通用的标准,因此又称为JPEG标准。JPEG是一个适用范围很广的静态图像数据压缩标准,既可用于灰度图像又可用于彩色图像。
JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换(Discrete Cosine Transform,DCT)为基础的有损压缩算法,另一种是采用以预测技术为基础的无损压缩算法。使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。例如,在V-CD和DVD-Video电视图像压缩技术中,就使用JPEG的有损压缩算法来取消空间方向上的冗余数据。为了在保证图像质量的前提下进一步提高压缩比,近年来JPEG专家组正在制定JPEG 2000(简称JP 2000)标准,这个标准中将采用小波变换(wavelet)算法。
JPEG压缩是有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。压缩编码大致分成三个步骤:
1.使用正向离散余弦变换(forward discrete cosine transform,FDCT)把空间域表示的图变换成频率域表示的图。
2.使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的。
3.使用霍夫曼可变字长编码器对量化系数进行编码。
译码或者叫做解压缩的过程与压缩编码过程正好相反。
JPEG算法与彩色空间无关,因此“RGB到YUV变换”和“YUV到RGB变换”不包含在JPEG算法中。JPEG算法处理的彩色图像是单独的彩色分量图像,因此它可以压缩来自不同彩色空间的数据,如RGB, YCbCr和CMYK。
JPEG压缩编码算法的主要计算步骤如下:
1.正向离散余弦变换(FDCT)。
2.量化(quantization)。
3.Z字形编码(zigzag scan)。
4.使用差分脉冲编码调制(differential pulse code modulation,DPCM)对直流系数(DC)进行编码。
5.使用行程长度编码(run-length encoding,RLE)对交流系数(AC)进行编码。
6.熵编码(entropy coding)。
2. 量化
量化是对经过FDCT变换后的频率系数进行量化。量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目。量化是图像质量下降的最主要原因。
对于有损压缩算法,JPEG算法使用均匀量化器进行量化,量化步距是按照系数所在的位置和每种颜色分量的色调值来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此图中的左上角的量化步距要比右下角的量化步距小。
3. Z字形编排
量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排,如图5-17所示。这样就把一个8 ? 8的矩阵变成一个1 ? 64的矢量,频率较低的系数放在矢量的顶部。
4. 直流系数的编码
8 ? 8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8 ? 8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码,
Delta=DC(0, 0)k-DC(0, 0)k-1 ........ (5-5)
5. 交流系数的编码
量化AC系数的特点是1 ? 64矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。
JPEG使用了1个字节的高4位来表示连续“0”的个数,而使用它的低4位来表示编码下一个非“0”系数所需要的位数,跟在它后面的是量化AC系数的数值。
6. 熵编码
使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交流AC系数作进一步的压缩。
在JPEG有损压缩算法中,使用霍夫曼编码器来减少熵。使用霍夫曼编码器的理由是可以使用很简单的查表(lookup table)方法进行编码。压缩数据符号时,霍夫曼编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种可变长度的霍夫曼码表可以事先进行定义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)