MT9D111调试----保存JPG格式图像

2019-12-31 19:13发布

各位高手:
   小弟现在使用STM32驱动MT9D111摄像头进行拍照,目前已配置图像输出大小为320*240,图片输出格式为RGB565。但是老总要求保存图片格式为JPG,MT9D111的手册我已经看了好几遍了,可能还是没有看懂。我觉得配置JPG格式太麻烦了,一时有点无从下手。希望哪位大侠能够指点迷津!
   另外还有一个问题:我是用STM32直接驱动,在每个像素时钟PCLK上升沿读取数据,由于STM32的速度不够快。这样读数据就会丢大量的数据。我想问下,怎样给STM32分频,MT9D111我用STM32的PA8提供8MHZ时钟频率的。我现在想知道,怎样配置寄存器,使PCLK的输出速率降下来,使STM32能够直接处理。
   拜托了!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
dongfengge555
1楼-- · 2020-01-01 13:35
好。呵呵,希望研究的人越多越好。JPEG配置貌似比较难,到现在为止,在网上还没有碰到哪位哥们把这个给配置出来。真的是万分期待一位牛人出现。呵
wuxianglei
2楼-- · 2020-01-01 17:18
 精彩回答 2  元偷偷看……
dongfengge555
3楼-- · 2020-01-01 21:08
如果要从BMP转到JPG,要加入算法。估计也比较麻烦。我现在用的这款MT9D111摄像头,里面集成了JPEG的编 码器。处理速度很快,所以我想通过配置寄存器一步到位。只是现在寄存器越看越糊涂。
    另外,要告诉大家一个好消息。昨天我终于把MT9D111调通了,配置图像输出大小为320*240,输出格式为RGB565,BMP的。图像送到TFT屏上显示。200万像素的MT9D111,显示在屏上的图像还不错。唯一的缺陷就是图像不是太流畅。呵呵
    希望有朋友和我一起研究MT9D111的JPEG图像格式的配置。
dongfengge555
4楼-- · 2020-01-02 01:18
现在遇到难题了哦。我现在在调MT9D111摄像头的BMP图片。我把图片送入TFT上显示,另加一个拍照键。当我按下拍照键,我会从屏的GRAM缓冲区中将屏上显示的图片数据读取出来,然后保存至SD中。
    但是这时候问题就出现了,有时候按下拍照键,会出现突然白屏的现象。数据也无法保存。一直没找到原因在哪。求高手指教!!!
static const u8 bmp_tou[54]={//构造bmp首部
        0x42, 0x4D, 0x36, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
        0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };

     //文件系统结构体定义
    FATFS fs;         /* Work area (file system object) for logical drives */
    FIL fsrca;     /* file objects */
    //BYTE buffer[1024];   /* file copy buffer */
    FRESULT res;         /* FatFs function common result code */
    UINT br, bw;         /* File read/write count */
    char buffer[960],i=0;
    XCHAR file_name[]="IMG00000.bmp";
    int tx,ty,rgb_datr;
    char R,G,B;
    int TPX=0,TPY=0;
    u8 RTC_FG=0;
    DIR dirs;
/*=================================变量定义=============================*/

#define key_state  GPIOC->IDR&GPIO_Pin_12
uint8_t key_val1,key_val2,key_val3;
/*=================================函数申明=============================*/
void RCC_Configuration(void);

/*===================================中断===============================*/
void EXTI2_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line2) != RESET)
     {
        if(key_state)
                {
                    key_val2++;
                    if(key_val2>3)
                    key_val2=3;
                }
                else if(key_val2>2)
                {
                 key_val1=1;
                     key_val2=0;
        }  
        if(key_val1==0)
                {
                  led_off;
                  pclk_on_l;//禁止外部CLK,使单片机WR与TFT WR相连       
                  cmos_cs_h;//禁止外部数据线,使单片机数据与TFT数据线相连       
                  tft_gpio_output();//数据线输出,准备连数据线到TFT
                 
                  LCD_WR_REG(0x0020,239);//
                  LCD_WR_REG(0x0021,0);//
                  LCD_WR_REG(0x0003,0x1028);

                  LCD_WR_REG(0x0020,0);//
                          LCD_WR_REG(0x0021,90);//改变坐标位置,移动图像位置
                          LCD_WR_REG(0x0003,0x1038);

                  LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
                  LCD_WR_REG(0x0051,239);//水平GRAM终止位置
                  LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
                  LCD_WR_REG(0x0053,319);//垂直GRAM终止位置         
                         
                        LCD_WR_REG16(0x0022);
                         
                        tft_gpio_input();//数据线输入,准备连接外部数据线到TFT                 
                          lcd_rs_h;//数据使能
                          lcd_wr_l;//使能外部时钟         

                          pclk_on_h;//使能外部CLK
                          cmos_cs_l;//使能外部数据线,与TFT数据线相连
                  lcd_cs_l;//
        }
        else
        {
            led_on;
            pclk_on_l;//禁止外部CLK,使单片机WR与TFT WR相连       
            cmos_cs_h;//禁止外部数据线,使单片机数据与TFT数据线相连       
                        EXTI->IMR &= 0<<2;//屏蔽场中断         
        }
        EXTI_ClearITPendingBit(EXTI_Line2);
     }
}

/*==================================主函数==============================*/
int main(void)
{
    RCC_Configuration();
        SPI_Configuration();
        LCD_Init();
        LCD_write_english_string(5,66+16,"MT9D111 Init......",0Xf800,0X0000);
               
        if(key_state)
        {
            while(canmera_9d111_init()!=1);
                while(canmera_9d111_init()!=1);
            LCD_write_english_string(5,66+16,"MT9D111 Init......ok",0Xf800,0X0000);
                delay_ms(1500);
                exti_interrupt_open(); //open vsync interrupt pd2
        }                                                                                                                                                                                                                

        while(1)
        {
                if(key_val1==1)
                {       
                        cmos_cs_h;//禁止外部数据线,使单片机数据与TFT数据线相连       
                pclk_on_l;//禁止外部CLK,使单片机WR与TFT WR相连       
                LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
                LCD_WR_REG(0x0051,239);//水平GRAM终止位置
                LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
                LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
                
                file_name[7]++;//更新文件名字
                if(file_name[7]>'9')
                {
                    file_name[7]='0';
                    file_name[6]++;
                    if(file_name[6]>'9')
                    {
                        file_name[6]='0';
                        file_name[5]++;
                        if(file_name[5]>'9')
                        {
                             file_name[5]='0';
                             file_name[4]++;
                             if(file_name[4]>'9')
                             {
                                 file_name[4]='0';
                                 file_name[3]++;            
                             }
                         }
                     }
                 }   
                 f_mount(0, &fs);
                 res = f_open(&fsrca,file_name, FA_CREATE_ALWAYS | FA_WRITE);  
                 res = f_write(&fsrca, bmp_tou,54, &bw);  
                 ////////////////////////////////////////////
                     for (ty = 0; ty < 240; ty++)
                 {
                         for(tx=319;tx>=0;tx--)
                     {              
                         LCD_WR_REG(0x0020,ty);//
                             LCD_WR_REG(0x0021,320-tx);//
                         LCD_WR_REG16(0x0022);
                         lcd_wr_h;
                         lcd_rs_h;
                         tft_gpio_input();
                         lcd_cs_l;
             
                         rgb_datr=LCD_RD_DATA16();//无用的读取////              
                         rgb_datr=LCD_RD_DATA16();//读GRAM//////////  
                         lcd_cs_h;
                         tft_gpio_output();
                         ///////R G B {MOD}空域变换/////////////
                         B = (rgb_datr>>8)&0xF8;
                         G = (rgb_datr>>3)&0xFC;
                         R = (rgb_datr<<3)&0xF8;
                                 buffer[tx*3+2] = R;
                                 buffer[tx*3+1] = G;
                                 buffer[tx*3+0] = B;
                         }
                     res = f_write(&fsrca, buffer, 960, &bw);   
                } /**/
                f_close(&fsrca);   
                f_mount(0,0);// Unregister a work area before discard it   
                        key_val1=0;
                        EXTI->IMR |= 1<<2;//中断屏蔽寄存器开启 连续采集
                }  
        }
}
lovefei
5楼-- · 2020-01-02 04:50
LS能不能介绍一下MT9D111的寄存器配置问题,或者寄存器参数配置的初始值能否公布一下?
hellowly
6楼-- · 2020-01-02 09:18
回复【9楼】dongfengge555 冷东风
-----------------------------------------------------------------------

楼主 请问你是用的stm32f103的吗 怎样使PCLK的输出速率降下来,使STM32能够直接处理?谢谢了

一周热门 更多>