DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题
DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题
1.DLP LCR4500 Pattern生成原理
1.1 主要函数调用关系:
函数解析:
1.1.1(Fun1)PrepareProjectorPatterns(L82)
(1)设置水平和垂直模式(读取配置文件设置相关参数)
(2)生成标定、垂直(vertical)、水平(horizontal)Pattern序列,加载到all_patterns(L206)
中
(3)运行PreparePatternSequence(lcr4500.cpp)
函数准备Pattern序列
1.1.2(Fun4)PreparePatternSequence(L1556)
(1)创建固件图,即函数CreateFirmwareImages(lcr4500.cpp)
(2)判断固件是否已经准备好(pattern_sequence_prepared_
标志位是否置位),如果已经置位,则不加载固件(即DEMO第3步)
如果未置位,则先生成固件生成固件dlp_sdk_lcr4500_dlpc350_prepared.bin
(执行函数CreateFirmware(L1621))
然后再加载固件(执行函数UploadFirmware(L1626)
),擦除flash,写入flash
1.1.3(Fun5)CreateFirmwareImages(L1607)
被(Fun4)PreparePatternSequence
调用,用于生成固件图(即1bit、8bit的Pattern图像转换成24bit(3个8bit)的加载到flash的固件图(RGB图像)),生成原理见(2.固件图生成原理)
程序实现如下:
调用(Fun6)StartPatternImageStorage(lcr4500.cpp)函数,该函数可以实现区分不同位深Pattern的目的
例如:现在有五张Pattern(1bit(0)、1bit(1)、1bit(1)、8bit(10101010)、8bit(11110000))
现在需要将这三张图组合成一张24bit的图
(1)首先会将前三张1bit的图组合成一张8bit的图,没有的位置补0,因此会得到一张8bit的图(00000110)
(2)然后将后面两张Pattern生成两张8bit的图(10101010)(11110000)
因为组合时是向左移位,因此最后按顺序生成的24bit图是11110000 10101010 00000110
从右到左分别组成图像的G、R、B通道
1.2 固件图生成原理
混合编码中生成的pattern有40张:
生成的Pattern图(1bit的二值图与8bit的灰度图):
组合成的固件图(RGB图):
第一张固件图:
pic0:标定板图,1bit,单独生成第一张固件图的G通道
pic1:垂直方向相移法第一张Pattern,8bit,生成第一张固件图的R通道
pic2:垂直方向相移法第二张Pattern,8bit,生成第一张固件图的B通道
第二张固件图:
pic3:垂直方向相移法第三张Pattern,8bit,生成第二张固件图的G通道
pic4-pic11:垂直方向格雷码的前八张Pattern,每张1bit,组合成第二张固件图的R通道
pic12-pic19:垂直方向格雷码的后八张Pattern,每张1bit,组合成第二张固件图的B通道
第三章固件图:
pic20:水平方向相移法第一张Pattern,8bit,生成第三张固件图的G通道
pic21:水平方向相移法第二张Pattern,8bit,生成第三张固件图的R通道
pic22:水平方向相移法第三张Pattern,8bit,生成第三张固件图的B通道
第四张固件图:
pic23-pic30:水平方向格雷码前八张Pattern,每张1bit,组合成第四张固件图的G通道
pic31-pic38:水平方向格雷码中八张Pattern,每张1bit,组合成第四张固件图的R通道
pic23-pic30:水平方向格雷码后两张Pattern,每张1bit,组合成第四张固件图的B通道
2.DLP SDK在Ubuntu下编译出现的Pattern固件图乱码问题
使用Demo Hybrid Three Phase Shift算法生成Pattern固件图时出现乱码问题
问题出现在源码中lcr4500.cpp文件中
temp_firmware_image为固件图变量,正常流程应当位标志image_bit_position达到24位(即temp_firmware_image通过Pattern移位形成了一张完整的固件图)后将其保存为一张固件图
因此每当image_bit_position达到24bit(图1-L2713)后即将其清空(图1-L2731)并重新创建(图1-L2734)
但是通过对像素数值的分析发现其重新创建后又恢复了原有数值,而不是为0
图1:
图2:
这样就会导致乱码的出现:
图2:L2800-L2806这段程序中,如果temp_firmware_image还是保持原有数值,那么当生成第二张固件图开始时fw_pixel获取了第一张固件图的temp_firmware_image像素值,这样第二张固件图就会在第一张固件图的基础上进行累加,因此导致了乱码的出现
图3:
解决方法: 在L2713的if条件语句的最后(L2743)加上图3所示程序以在每次达到24bit需要进行下一张固件图处理时清空temp_firmware_image,从而保证新固件图生成累加时不出现错误