Eurasia32 发表于 2022-8-7 14:59

[国民技术N32WB452测评]四.LCD显示DVP采集图像

本帖最后由 Eurasia32 于 2022-8-7 14:59 编辑

<p>在上次评测中实现了通过DVP接口驱动GC0308摄像头进行图像采集的功能,本次测评将实现将采集图像显示至LCD显示屏。</p>

<ol>
        <li>实现LCD显示屏驱动
        <ol>
                <li>
                <p>本次测评使用的LCD显示屏为合宙的1.8寸 TFT LCD,分辨率128*160,驱动芯片为ST7735。</p>
                </li>
                <li>
                <p>在官方提供SDK中 \BLE\devBoardDemo项目下提供了LCD屏幕的驱动,复制相关所需文件至对应项目中即可实现LCD驱动,其中lcd_dev.c文件包含相关寄存器配置,注意注释掉下图所示行</p>

                <pre>
<code>LCD_SendCommand(0x21);</code></pre>

                <p>该寄存器控制LCD屏幕颜色反演,若不注释可能造成显示颜色出错,同时注意修改lcd_drv.h头文件中对于现实区域大小的设置,即</p>

                <pre>
<code>#define LCD_HEIGHT 128
#define LCD_WIDTH  160
#define LCD_WIDTH_Byte 160</code></pre>

                <p>修改为本次所对应的128、160以及160。</p>
                </li>
                <li>
                <p>实现图像显示的函数为void LCD_Display(uint16_t* Image),该函数功能为将内存中的16位无符号整形数组显示至LCD上,符合通过DMA直接传输图像的要求。</p>
                </li>
        </ol>
        </li>
        <li>实现GC0308摄像头驱动
        <ol>
                <li>
                <p>在官方提供SDK中\DVP\Camera项目下提供了摄像头相关驱动,其中gc0308.c文件设置相关寄存器以及接口初始化,dvp_demo.c文件则设置数据引脚初始化以及DVP,DMA的配置,在dvp_demo.h头文件中设置了输出图像的格式以及大小:</p>

                <pre>
<code>#define DVP_IMAGE_FORMAT            (DVP_IMAGE_FORMAT_RGB565)
//#define DVP_IMAGE_FORMAT            (DVP_IMAGE_FORMAT_GRAY)

#define DVP_IMAGE_PIXEL_SIZE      (DVP_IMAGE_FORMAT)

#if (DVP_IMAGE_FORMAT == DVP_IMAGE_FORMAT_GRAY)
    #define DVP_IMAGE_WIDTH             ((uint16_t)320)
    #define DVP_IMAGE_HEIGHT            ((uint16_t)240)
        //#define DVP_IMAGE_WIDTH             ((uint16_t)160)
    //#define DVP_IMAGE_HEIGHT            ((uint16_t)128)
#else
    //#define DVP_IMAGE_WIDTH             ((uint16_t)274)
    //#define DVP_IMAGE_HEIGHT            ((uint16_t)206)
        #define DVP_IMAGE_WIDTH             ((uint16_t)160)
    #define DVP_IMAGE_HEIGHT            ((uint16_t)128)
#endif</code></pre>

                <p>&nbsp;</p>
                </li>
        </ol>
        </li>
        <li>通过DMA将采集图像传输至LCD
        <ol>
                <li>
                <p>在dvp_demo.c文件中定义了</p>

                <pre>
<code>uint32_t DVP_Image = {0};</code></pre>

                <p>常量用于存储相关图像,将其以外部全局变量形式添加至main.c文件中,在DVPDemo_Caputure()函数后直接使用LCD_Display()输出DVP_Image即可实现图像传输。</p>
                </li>
        </ol>
        </li>
        <li>最终效果03942ce7a078e97c75cf55fb6af3626c<br />
        &nbsp;</li>
        <li>总结
        <ol>
                <li>&nbsp; &nbsp;图像显示帧率较为理想,不足之处在于屏幕在扫描时会出现红色条纹,起初我以为是显示屏BGR模式和RGB模式未设置好造成的,但向0x36寄存器中写入的值由0x60(RGB)变为0x68(BGR)后扫描时红线变为蓝线,说明并非颜色显示模式的问题,现在对这个问题暂时没有头绪,一个可能的方向是LCD与开发板之间连接未使用排线造成的信号干扰,若有遇到相同问题或有解决思路的欢迎来讨论。</li>
                <li>其次,显示图像质量较差,主要原因可能是GC0308摄像头只有30W像素,换用OV2640等摄像头后情况可能会改善。</li>
        </ol>
        </li>
        <li>代码</li>
</ol>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>

lugl4313820 发表于 2022-8-7 21:18

显示图像质量较差,主要原因可能是GC0308摄像头只有30W像素。可不可设置分辨率,然后就会清晰一些。

Eurasia32 发表于 2022-8-7 21:58

lugl4313820 发表于 2022-8-7 21:18
显示图像质量较差,主要原因可能是GC0308摄像头只有30W像素。可不可设置分辨率,然后就会清晰一些。

<p>是指摄像头的分辨率还是屏幕的分辨率?我比较小白<span style="-webkit-tap-highlight-color:rgba(0, 0, 0, 0)">&#128514;</span></p>

lugl4313820 发表于 2022-8-8 01:33

<p>我看了一下你的LCD屏本身的显示的像数就比较大,显得图像不是很好,可以换一下其他的屏试一下。你所设置的分辨率为128*160 = 20,480,好象才2万像数,才不到1/15,这个摄像头可以达到640*480 30fps。</p>

Eurasia32 发表于 2022-8-8 01:41

lugl4313820 发表于 2022-8-8 01:33
我看了一下你的LCD屏本身的显示的像数就比较大,显得图像不是很好,可以换一下其他的屏试一下。你所设置的 ...

<p>好的,感谢回复,过一阵我换个大点的屏幕试试&#128514;</p>

Eurasia32 发表于 2022-8-8 03:19

lugl4313820 发表于 2022-8-8 01:33
我看了一下你的LCD屏本身的显示的像数就比较大,显得图像不是很好,可以换一下其他的屏试一下。你所设置的 ...

<p>根据您的建议,我在没有换lcd屏幕的前提下试着改了一下gc0308的图像窗口设置,原先设置为windowing vga格式输出,即640X480,同时subsample设置4/7缩放,修改为qqvga格式输出,即160X120,然后将subsample设置为不缩放,显示图像质量确实有一定改善。</p>

littleshrimp 发表于 2022-8-8 07:28

<p>扫描红线有没有可能是VSYNC 或者HSYNC电平设置造成的?</p>

秦天qintian0303 发表于 2022-8-8 09:28

<p>相当可以了,不过曝光是不是有点高啊</p>

Eurasia32 发表于 2022-8-8 13:36

秦天qintian0303 发表于 2022-8-8 09:28
相当可以了,不过曝光是不是有点高啊

<p>vga输出的时候帧数最大是30fps,原先帧数设置为16.67fps,我调到qqvga输出以后采用了100fps的输出,曝光时间应该是原先1/6,拍摄灯光等较明亮物体时有一定改善</p>

Eurasia32 发表于 2022-8-8 13:38

littleshrimp 发表于 2022-8-8 07:28
扫描红线有没有可能是VSYNC 或者HSYNC电平设置造成的?

<p>vsync和hsync相关寄存器配置我是沿用的例程,相关说明在gc0308手册上比较少,调整不是非常方便&#128514;</p>

通途科技 发表于 2024-6-21 05:31

wdcfgd 发表于 2024-10-16 18:21

有朋友验证上面代码么,感觉不点不对
页: [1]
查看完整版本: [国民技术N32WB452测评]四.LCD显示DVP采集图像