单片机论文.docx
- 文档编号:29525232
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:23
- 大小:1.08MB
单片机论文.docx
《单片机论文.docx》由会员分享,可在线阅读,更多相关《单片机论文.docx(23页珍藏版)》请在冰豆网上搜索。
单片机论文
河北农业大学现代科技学院
本科毕业论文(设计)
题目:
线阵CCD图像传输与拼接系统设计
学部:
工学部
专业班级:
电子信息科学与技术0801
学号:
2008614140111
学生姓名:
郭子选
指导教师姓名:
史智兴
指导教师职称:
教授
2012年5月30日
摘要
随着线阵CCD的发展,其在我们生活中有了广泛的应用,结构简单,成本较低。
因为其自身的特点,如终点计时系统也采用的线阵CCD,并广泛应用于各种大型比赛当中。
我们通过下位机拍摄线阵图像,然后通过与计算机相连,让我们可以方便的在计算机上直观的看到比赛的图片,并通过图片来确定每个人的比赛成绩,这才是最终的目的。
然而我们传送的数据都是二进制的数据,我们的图片也都是二进制的数据,传送的数据在文件中也不是顺序存储在文件的某个区域,我们需要对图片的格式有一个比较透彻的理解,才能将下位机传输的数据正确的拼接成图片。
关键词:
线阵CCD图片格式图片数据
Abstract
WiththedevelopmentoflineararrayCCD,inourlifearewidelyused,andhastheadvantagesofsimplestructure,lowcost.Becauseofitsowncharacteristics,suchasterminaltimingsystemusedCCDarray,andiswidelyusedinvariouslargegame.Wethroughthemachineshootinglineimage,andthenisconnectedwiththecomputer,sothatwecaneasilyinthecomputergameonintuitivetoseethepicture,andthepicturetoidentifyeachmatchscore,whichistheultimatepurposeof.However,ourdataarebinarydata,ourpicturesarealsobinarydata,transmissionofdatainthefileisstoredinthefileintheorderofaregion,weneedtopictureformattohaveamorethoroughunderstanding,canlowermachinetransmissiondatacorrectlysplicedintothepicture.
Keywords:
LineararrayCCDImageformatThepicturedata
目录
第一章引言1
1.1为什么要研究图像拼接1
1.2图像拼接的目的1
第二章图片以及格式简介1
2.1图片是如何在计算机中存储的1
2.2bmp图片简介1
2.3BMP图像文件的组成2
2.3.1BMP图片总体组成2
2.3.2位图文件头(bitmap-fileheader)2
2.3.3位图信息头(bitmap-informationheader)3
2.3.4彩色表/调色板(colortable)4
2.3.4位图数据(bitmap-data)4
第三章图像拼接的流程5
第四章文件流6
4.1文件流的意义6
4.2fstream类7
4.2.1打开文件7
4.2.2关闭文件8
4.2.3文件的流指针8
4.2.4文件的读写9
第五章图像的每个像素在数据区的位置10
第六章调试及性能分析11
5.1测试的条件11
5.2图片的选择11
5.3图片拼接后的结果12
第六章结论14
参考文献16
第一章引言
1.1为什么要研究图像拼接
随着线阵CCD的发展,其在我们生活中有了广泛的应用,结构简单,成本较低。
可以同时储存一行电视信号.由于其单排感光单元的数目可以做得很多,在同等测量精度的前提下,其测量范围可以做的较大,并且由于线阵CCD实时传输光电变换信号和自扫描速度快、频率响应高,能够实现动态测量,并能在低照度下工作,所以线阵CCD广泛地应用在产品尺寸测量和分类、非接触尺寸测量、条形码等许多领域。
因为其自身的特点,终点计时系统也采用的线阵CCD,并广泛应用于各种大型比赛当中。
国内关于CCD线阵的研究也有很多,天津大学的王勤,在其2005年毕业论文,高速线阵CCD图像数据采集系统的研究,模拟了开发与后期处理的整套流程[1]。
哈尔滨工程大学的许峰,彩色CCD径赛计时系统研究[2],对CCD在体育比赛的具体项目中进行了研究。
当数据通过下位机与上位机之间的通讯传输到计算机上时,我们就要研究数据是以怎样的形式传输过来的,要以什么形式存储在计算机中,这正是我需要研究的问题。
1.2图像拼接的目的
接收ARM+DSP传来的线阵图像数据。
我希望通过研究传输后在上位机上的拼接等操作。
BMP图片在计算机的存储格式需要清除的了解,才能将传输过来的数据正确的拼接成一幅图片。
对文件的操作有一定的了解才能将传过来的数据保存在存储介质中。
所以我们主要是研究BMP图片格式、BMP图片的数据部分是如何存储图像数据的以及对文件操作需要用到什么函数。
最终让我们可以在计算机中查看图片,并通过图片来查看运动员的比赛成绩。
第二章图片以及格式简介
2.1图片是如何在计算机中存储的
计算机中的文件是以二进制的方式存储在计算机中[3],图片文件也不例外。
当我们要打开一个文件的时候,计算机会将存在硬盘或其他存储介质中的数据调入内存,然后再对文件进行我们需要的操作。
当我们完成了对文件的操作时,再将文件保存到硬盘或其他存储介质中,以便以后继续应用。
其在计算机中的表现形式都是以二进制形式,我们面对的都是二进制的数据。
2.2bmp图片简介
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-IndependentDevice,设备无关位图),是Windows系统中广泛使用的图像文件格式。
它可以不作任何变换地保存图像像素域的数据。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,bmp文件所占用的空间很大。
bmp文件的图像深度可选lbit、4bit、8bit及24bit。
bmp文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
2.3BMP图像文件的组成
2.3.1BMP图片总体组成
BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据[4][5]。
在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。
其在计算机中的组成如表1所示。
表1BMP图像文件的组成
位图文件头(bitmap-fileheader)
位图信息头(bitmap-informationheader)
彩色表/调色板(colortable)
位图数据(bitmap-data)
2.3.2位图文件头(bitmap-fileheader)
位图文件头(bitmap-fileheader)包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段。
BMP文件的位图文件头的数据结构定义。
typedefstructtagBITMAPFILEHEADER{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
下表列出了tagBITMAPFILEHEADER中各字段的含义(表2)。
表2 tagBITMAPFILEHEADER结构
字段名
大小(单位:
字节)
描述
bfType
2
位图类别,根据不同的操作
系统而不同,在Windows
中,此字段的值总为‘BM’
bfSize
4
BMP图像文件的大小
bfReserved1
2
总为0
bfReserved2
2
总为0
bfOffBits
4
BMP图像数据的地址
2.3.3位图信息头(bitmap-informationheader)
位图信息头(bitmap-informationheader)包含了位图信息头的大小、图像的宽高、图像的色深、压缩说明图像数据的大小和其他一些参数。
BMP文件的位图信息头的数据结构定义为
typedefstructtagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
表3列出了tagBITMAPFILEHEADER中各字段的含义。
表3各字段含义
字段名
大小
(单位:
字节)
描述
biSize
4
本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节
biWidth
4
BMP图像的宽度,单位像素
biHeight
4
总为0
biPlanes
2
总为0
biBitCount
2
BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色
biCompression
4
压缩方式,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩,3表示每个像素值由指定的掩码决定
biSizeImage
4
BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足
biXPelsPerMeter
4
水平分辨率,单位像素/m
biYPelsPerMeter
4
垂直分辨率,单位像素/m
biClrUsed
4
BMP图像使用的颜色,0表示使用全部颜色,对于256色位图来说,此值为100h=256
biClrImportant
4
重要的颜色数,此值为0时所有颜色都重要,对于使用调色板的BMP图像来说,当显卡不能够显示所有颜色时,此值将辅助驱动程序显示颜色
2.3.4彩色表/调色板(colortable)
彩色表/调色板(colortable)是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像的数据是指向调色板的索引[6]。
由于本次采用的是真彩色图片,所以没有调色板。
图片的颜色由红绿蓝三原色组合而成,可以呈现更多的色彩。
2.3.4位图数据(bitmap-data)
本次设计采用的图片和所要组成的图片是24位真彩色图像。
24位图像使用3字节保存颜色值,每一个字节代表一种颜色,按红、绿、蓝排列。
红绿蓝就是所说的三原色。
三原色由三种基本原色构成。
原色是指不能透过其他颜色的混合调配而得出的“基本色”。
以不同比例将原色混合,可以产生出其他的新颜色。
以数学的向量空间来解释色彩系统,则原色在空间内可作为一组基底向量,并且能组合出一个“色彩空间”[7][8]。
由于人类肉眼有三种不同颜色的感光体,因此所见的色彩空间通常可以由三种基本色所表达,这三种颜色被称为“三原色”(图1)。
图1三原色
第三章图像拼接的流程
由于在运动员进行运动的过程中,CCD线阵摄像机即时的对一列图像进行捕捉,然后通过与上位机通信,将图片的信息传递给计算机,然后通过计算机调用相关的函数,将其发送过来的数据放置到图像文件的数据部分,并对图像文件的某些参数进行设置,最后保存由CCD线阵所采集到的数据,这时就构成了一副完整的图片。
以下是图像拼接的流程图(图2)。
图2流程图
图4流程图
第四章文件流
4.1文件流的意义
在本次设计中,我们在计算机上建立了一个BMP文件,这样我们只需要修改文件头的关键几个参数就能达到让图片正常显示的目的,要打开或修改图片的某一个参数就要用到我们C++中的文件流
那什么是流呢?
流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。
在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向。
流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。
通过文件流我们可以很方便的完成对文件的操作
4.2fstream类
在C++中,对文件的操作是通过stream的子类fstream(filestream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h[9]。
4.2.1打开文件
在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:
voidopen(constchar*filename,intmode,intaccess);
其中所包含的3个参数分别有以下三个含义:
filename:
要打开的文件名
mode:
要打开文件的方式
access:
打开文件的属性
打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下表4所示:
表4文件打开方式
ios:
:
in(0x01)
文件不存在则创建(ifstream默认的打开方式)
ios:
:
out(0x02)
文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
ios:
:
ate(0x04)
文件打开时,指针在文件最后。
可改变指针的位置,常和in、out联合使用
ios:
:
app(0x08)
文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
ios:
:
trunk(0x10)
在读写前先将文件长度截断为0
ios:
:
nocreate(0x20)
文件不存在时产生错误,常和in或app联合使用
ios:
:
noreplace(0x40)
/文件存在时产生错误,常和out联合使用
ios:
:
binary(0x80)
二进制格式文件
当我们要打开的文件方式有多种时,我们可以用“或”把以上属性连接起来,如ios:
:
out|ios:
:
binary。
fstream有两个子类:
ifstream(inputfilestream)和ofstream(outputfilestream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。
下面结合程序中关于打开文件的语句进行分析:
在程序中我们首先要打开一个已知的的文件,然后对这个已知的文件进行修改就可以。
ofstreamwbmp("E:
\\pinjie\\file2.bmp",ios:
:
out&&0xFFEF);
因为ofstream语句是默认以输出方式打开文件,但是默认的方式打开,然而文件默认打开方式是文件不存在则创建,若文件已存在则清空原内容,我们正好是要打开一个一直的文件,所以文件打开会清空原来的内容,但我们需要保存文件头的信息。
这时就产生了矛盾。
所以我们需要对文件的打开方式进行一下设置,ios:
:
out&&0xFFEF,这样我们队打开方式对应的位做与运算,使得文件打开的时候不会清除原来的内容,将原来文件的内容截断成0,所以我们需要将ios:
:
trunk对应的二进制代码取反,然后和默认打开方式做与运算,这样可以将让ios:
:
trunk对应的打开方式不生效,从而保存了图片头的信息。
表5对是将其运算的运算过程。
表5运算过程
默认打开方式对应的二进制代码
00011000
0xFFEF的二进制代码
11101111
做与运算
00001000
4.2.2关闭文件
打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:
file1.close();就把file1相连的文件关闭。
这样可以有效保证图片信息不会丢失。
4.2.3文件的流指针
要完成对文件的读写,首先要实现对文件指针进行设置,将指针指向文件的不同区域,这些区域存放就是文件的参数,然后就可以完成对文件的读写操作了,C++的I/O系统管理两个与一个文件相联系的指针。
一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。
每次执行输入或输出时,相应的指针自动变化。
所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和seekp(),seekg()是设置读位置,seekp是设置写位置。
一下是对两个函数的具体说明:
seekp:
设置输出文件流的文件流指针位置
seekg:
设置输入文件流的文件流指针位置
函数原型:
ostream&seekp(streampospos);
ostream&seekp(streamoffoff,ios:
:
seek_dirdir);
istream&seekg(streampospos);
istream&seekg(streamoffoff,ios:
:
seek_dirdir);
函数参数
pos:
新的文件流指针位置值
off:
需要偏移的值
dir:
搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置
在ios中定义的枚举类型:
enumseek_dir{beg,cur,end};
每个枚举常量的含义:
ios:
:
beg:
文件流的起始位置
ios:
:
cur:
文件流的当前位置
ios:
:
end:
文件流的结束位置
拼接的过程中我们需要的是将缓冲区的数据写入文件中,要定位到的文件的宽度,高度,将宽度高度修改即可。
(1)指向文件的高度
wbmp.seekp(22,ios:
:
beg);
这是修改指针位置指向文件距离文件流起始位置22个字节,指向的是文件的高度。
(2)指向文件的宽度
wbmp.seekp(18,ios:
:
beg);
这是修改指针位置指向文件距离文件流起始位置18个字节,指向的是文件的宽度。
4.2.4文件的读写
要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
read(unsignedchar*buf,intnum);
write(constunsignedchar*buf,intnum);
read()从文件中读取num个字符到buf指向的缓存中,如果在还未读入num个字符时就到了文件尾,可以用成员函数intgcount();来取得实际读取的字符数;而write()从buf指向的缓存写num个字符到文件中,值得注意的是缓存的类型是unsignedchar*,有时可能需要类型转换。
例如我们要从文件所需要的位置读出3个字节的数据,并将3个字节写入文件:
rbmp.seekg(roff,ios:
:
beg);
rbmp.read(tmp,3);
wbmp.seekp(woff,ios:
:
beg);
wbmp.write(tmp,3);
其中rbmp是要读出的文件,roff是距离读文件开始的偏移量,tmp存放的是读出的3个字节。
Wbmp是写文件,woff是距离写文件开始的偏移量。
第五章图像的每个像素在数据区的位置
图像的数据文件的结构及其大小由下表6可知:
表6bmp图像文件结构及大小
数据段名称
大小(Byte)
bmp文件头
14
bmp位图信息头
40
调色板
由颜色索引数决定
位图数据
由图像尺寸决定
由于我们采用的是24位的真彩色位图文件,所以没有调色板,这样在bmp文件头和bmp位图信息头之后就是位图数据了,即位图数据从位图文件开始之后的54个字节处开始。
图像数据存放的是每个像素的信息,像素信息是由三个字节组成,每个字节代表红绿蓝三种颜色其中的一个。
在每个图片中,我们要做的就是将缓存区的数据,存入文件中,入下图(图3)所示:
图6.1图像与数据位置的映射关系
图3图像与数据位置的映射关系
以需要将传来的像素放置到其对应的位置。
从54字节开始,每3个字节存放一个位图
像素的数据信息,按照从左到右,从下到上的顺序依次存储。
所以右上角的像素位置就应该是:
每行的数据所占的字节数*(行数-1)+(列数-1)*3。
在每行的像素还要是4的倍数,所以如果出现每行的像素数不是四的倍数那么自动补0。
下面式子可以得到每行位图数据所占的字节数:
bmpWidth*3+(4-(bmpWidth*3%4?
bmpWidth*3%4:
4))
其中bmpWidth为图片的宽度。
(4-(bmpWidth*3%4?
bmpWidth*3%4:
4))得到的是每行补0的数目。
第六章调试及性能分析
5.1测试的条件
由于下位机暂时无法传输过来数据,所以我们需要模拟图片的数据。
那么用什么来验证图片是不是拼接的正确呢?
经过以上的分析,我们知道图片的第一个像素是在图片的左下角,而传输过来的数据需要映射到右上角。
因此我想到了运用图片的翻转是否正确来验证图片拼接是否正确。
5.2图片的选择
如图所示,本次测试选择了以下图片(图4):
图4测试图片
这个图片是经过翻转之后的,经过翻转,其右上角的数据变到了右下角。
我们将其图片的数据区当做下位机传输过来的数据。
5.3图片拼接后的结果
经过用VB和C结合[10][11],可以查看拼接的结果,如下图5所示:
图5测试结果
对测试图片进行拼接后,发现图片左下角的数据变换到了右上角,其最下边的一行像素变换到了最右边,以此类推,最后拼接完成后,图片变成了原来未经翻转时的图片,这也从一个方面说明我们对图片拼接的步骤是正确的。
为了验证我们拼接的图片是否正确,对图片格式的理解是否正确,我们分别选取拼接其中的135行和300行(图6和图7)。
图6转换135行图片
图7转换300行图片
由于从这些特例依然是正确的,所以我们我们可以认定我们对图片格式和数据传输上的理解是正确的,我们对图片的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 论文