摄像头接到开始命令后开始采集图像,并将图像压缩为JPEG格式,摄像头采取分包传递的方式,每传递一个包后,只有上位机得到确认命令(即摄像头取图命令)后,摄像头才开始传下一个包,直到图像传递完成。
摄像头编号设置命令(由上位机发给视频模块)
(以下数据一般以16进制,即 0x 开头表示)
包头 (2字节) | 命令码 (1字节) | 位置编号 (1字节) | 数据(4字节) | 包尾 (2字节) | |
摄像头编号 (小端模式,2字节) | 该摄像头以后将要使用的编号 | ||||
0x40 0x40 | 0x60 | 0x5A | 0xFF 0xFF | 0xFF 0xFF | 0x0D 0x0A |
说明1:每个摄像头都有一个编号,当摄像头收到的数据域内的摄像头编号与自己相一致时才响应该命令,但如果该数据域内的摄像头编号为0xFFFF,表示通用编号,任何摄像头都要响应该命令。
说明2:该命令中的位置编号无实际意义;
说明3:摄像头收到该命令后将该编号存入非易失的存储器中,以后将只响应摄像头编号与新编号及通用编号相同的命令。
摄像头开始拍摄命令(由上位机发给视频模块)
包头 (2字节) | 命令码 (1字节) | 照片大小 (1字节) | 数据(4字节) | 包尾 (2字节) | |
摄像头编号 (小端模式) | 图像包大小 (小端模式) | ||||
0x40 0x40 | 0x61 | 0x80(160*128) 0x81(320*240) 0x82(640*480) | 0xFF 0xFF | 0xFF 0xFF | 0x0D 0x0A |
说明1:当摄像头收到的数据域内的摄像头编号与自己相一致时才响应该命令,但如果该数据域内的摄像头编号为0xFFFF,表示通用编号,任何摄像头都要响应该命令。
说明2:摄像头收到该命令后返回所拍图像数据的第一帧数据。
摄像头取图命令(由上位机发给视频模块)
包头 (2字节) | 命令码 (1字节) | 照片大小 (1字节) | 数据(4字节) | 包尾 (2字节) | |
摄像头编号 (小端模式) | 图像位置编号 (小端模式) | ||||
0x40 0x40 | 0x62 | 0x80(160*128) 0x81(320*240) 0x82(640*480) | 0xFF 0xFF | 0xFF 0xFF | 0x0D 0x0A |
说明1:当摄像头收到的数据域内的摄像头编号与自己相一致时才响应该命令,但如果该数据域内的摄像头编号为0xFFFF,表示通用编号,任何摄像头都要响应该命令。
说明2:当数据域内的图像位置编号为0xFF 0xFF表示按顺序取图,摄像头每次传送某位置的数据后,会自动把位置编号加一(位置编号从0开始);
说明3:当数据域内的位置编号不为0xFF 0xFF表示取固定位置的图像数据,主机端每次索要某位置的数据后,主机端需自己把位置编号加一;
说明3:照片大小字节无意义,但内容必须为0x81、0x82或0x83
摄像头上传图像数据包格式(由视频模块发给上位机)
1)
包头 | 位置 | 帧的大小 | 256 | 图像数据 | 校验和 | 结束 | |||
40 40 63 | KK KK | 00 02 | FF | FF D8 …… | 一 个 字 节 | 0D 0A | |||
XX XX | ……FF D9 | ||||||||
| 小端 | 小端 |
| 所有数据累加―――校验和 |
举例:0x40 0x40 0x63 0xKK 0xKK 0xXX 0xXX 0xFF 0xPP …… 0xVV 0x0D 0x0A
2)包头:0x40 0x40 0x63
3)数据开始传送位置:用两个字节表示:0xKK 0xKK 第一帧数据表示为0x00 0x00。上位机每发送一次
0x40 0x40 0x62 0x81 0xFF 0xFF 0xFF 0xFF 0x0D 0x0A,摄像头位置加1,直到数据传送完毕。
4)数据帧的大小:用两个字节表示:0xXX 0xXX 表示为0xXX 0Xxx 发送数据包;当数据包的大小不等于0xXX 0xXX 时,或图像数据的最后两个字节为0xFFD9时,说明数据传送到了最后一包数据,数据帧的大小和拍摄图片的大小有关。
数据内容:开始标志: FF D8 结束标志:FF D9 。 数据传送模式FF D8 ……0xVV 0D 0A,……FF D9 0xVV 0D 0A 。其中0xVV为校验和 。校验和的算法:图像数据累加和
注意:开始标志: FF D8 结束标志:FF D9 以及这两个标志之间的内容正好是jpg图像的格式,不得分割。
jpeg文件格式:
-- 文件头(2bytes)ff,d8(SOI)
-- 任意数量的段,见后
--文件结束(2bytes)ff,d9(EOI)
段的格式:
-- header(4bytes)
ff 段标识
n 段的类型(1byte)
sh,sl 该段长度,包括这两个字节,但不包括前面的ff和n
注意:长度不是intel序,而是motorola序,高字节在前,低字节在后
-- 该段的内容,最多65533字节
将数据写入文件时,文件一定要以二进制形式创建,写文件有文本格式和二进制格式之分,ios::binary就是二进制, 它与文本格式的差别在于,文本格式会增加一些格式上的信息,比如换行'\n'用文本输出是两个字节0x0Ah,0x0Dh. 而如用二进制输出则是0x0Ah。这样才能保证图像文件写入正确。
write(const unsigned char *buf,int num);
ostream &seekp(streamoff offset,seek_dir origin);
ios::cur: 文件当前位置
ios::end: 文件结尾
/* 目录是否存在的检查 */
BOOL FolderExist(CString strPath)
{
}
/* 文件存在性检查 */
BOOL FileExist(CString strFileName)
{
CFileFind fFind;
return fFind.FindFile(strFileName);
}
创建目录:
BOOL CreateFolder(CString strPath)
{
}