DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

1.DLP LCR4500 Pattern生成原理

1.1 主要函数调用关系:

Created with Raphaël 2.2.0(Fun1)PrepareProjectorPatterns(DLP_LightCrafter_4500_3D_Scan_Application.cpp)(Fun2)GenerateCalibrationBoard(DLP_LightCrafter_4500_3D_Scan_Application.cpp)(Fun3)GeneratePatternSequence(DLP_LightCrafter_4500_3D_Scan_Application.cpp)(Fun4)PreparePatternSequence(lcr4500.cpp)(Fun5)CreateFirmwareImages(lcr4500.cpp)(Fun6)StartPatternImageStorage(lcr4500.cpp)

函数解析:

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的灰度图):

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

组合成的固件图(RGB图):

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

第一张固件图:

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固件图时出现乱码问题

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的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:

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

图2:

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

这样就会导致乱码的出现:
图2:L2800-L2806这段程序中,如果temp_firmware_image还是保持原有数值,那么当生成第二张固件图开始时fw_pixel获取了第一张固件图的temp_firmware_image像素值,这样第二张固件图就会在第一张固件图的基础上进行累加,因此导致了乱码的出现

图3:

DLP LCR4500 Pattern生成原理(DEMO中第2步)及SDK在Ubuntu下编译出现的Pattern固件图乱码问题

解决方法: 在L2713的if条件语句的最后(L2743)加上图3所示程序以在每次达到24bit需要进行下一张固件图处理时清空temp_firmware_image,从而保证新固件图生成累加时不出现错误