stm32驱动ov7670 数据转BMP格式再转JPEG存储
一.搞了幾天攝像頭終于搞出來了一點成果,本打算用BMP格式保存讀出的數據但是數據太大達到225k,后來又將BMP數據轉成JPEG格式就小了很多,jpeg是有損壓縮圖片會變得不那么清晰。
搞出來的成果:
?
二.攝像頭小知識:XCLK是輸入攝像頭的時鐘,看別的原理圖接的是一個12M的晶振,初始化的時候4倍頻達到48M,這里沒有接,用PA8輸出8M內部6倍頻達到48M,PCLK是攝像頭輸出的時鐘達到12M,圖像輸出的是QVGA,RGB565格式,用的是VGA時序,一個像素需要2個pclk.
行輸出時序圖:
HREF是一個行信號,這個信號和mcu的一個引腳連接在SN74LVC1G00D(與非門)上,和mcu一塊控制fifo,當準備寫fifo時,mcu發送高電平,這時fifo并沒有被使能,只有當HREF產生高電平信號時,在PCLK的配合下將數據寫到fifo中。
幀輸出時序圖:
VSYNC是幀同步信號,當攝像頭采集到一幀數據,會發出幀同步信號,用外部中斷捕獲這個幀中斷信號。
void EXTI4_IRQHandler(void)
{?? ??? ??
?? ?if(EXTI_GetITStatus(EXTI_Line4)==SET)?? ?//是4線的中斷
?? ?{ ? if(OV7670_CS == 0)?
?? ??? ?{? ? ? ?
?? ??? ??? ??? ?if(ov_sta == 0)
?? ??? ??? ??? ?{?? ??? ??? ?
?? ??? ??? ??? ??? ?OV7670_WRST=0;?? ?//復位寫指針?? ??? ? ??? ??? ??
?? ??? ??? ??? ??? ?OV7670_WRST=1;?? ?
?? ??? ??? ??? ??? ?OV7670_WREN=1;?? ?//允許寫入FIFO ?? ??
?? ??? ??? ??? ??? ?ov_sta=1;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?OV7670_WRST=0;?? ?//復位寫指針?? ??? ? ??? ??? ??
?? ??? ??? ??? ??? ?OV7670_WRST=0;?? ?
?? ??? ??? ??? ??? ?OV7670_WREN=1;?? ?//允許寫入FIFO?
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ?}
?? ?EXTI_ClearITPendingBit(EXTI_Line4); ?//清除EXTI4線路掛起位?? ??? ??? ??? ??? ??? ? ?
}
三.讀取數據并轉換,也是仿照的別人的用的開源庫。
void camera_refresh(void)
{? ?
?? ?int width, height;
?? ?int j,i;
??? ?u16 color=0;
?? ?int col;
?? ?int t;
? ?jpeg_compress_info *cinfo;
?? ?pt_buf = 0;
?? ?if(ov_sta)//有幀中斷更新?
?? ?{
?? ??? ? ?width = 320;//圖像的寬度?
?? ??? ? ?height = 240;//圖像的高度?
?? ??? ? ?cinfo = jpeg_create_compress();
?? ??? ? ?if (!cinfo)?
?? ??? ? ?{
?? ??? ??? ?//printf("error in create cinfo, malloc faild!\n");
?? ??? ? ?}
?? ??? ? ?cinfo->image_width = width;
?? ??? ? ?cinfo->image_height= height;
?? ??? ? ?cinfo->output =(char *)JPG_enc_buf;//fopen("test.jpg", "wb");
?? ??? ? ?jpeg_set_default(cinfo); ?
?? ??? ? ?
?? ??? ? ?jpeg_start_compress(cinfo);
??
?? ??? ?FLASH_SIZE1 = 8192;
?? ??? ?OV7670_RRST=0;?? ??? ??? ??? ?//開始復位讀指針 ?? ??? ?
?? ??? ?OV7670_RCK_L;
?? ??? ?OV7670_RCK_H;
?? ??? ?OV7670_RCK_L;
?? ??? ?OV7670_RRST=1;?? ??? ??? ??? ?//復位讀指針結束?
?? ??? ?OV7670_RCK_H;?? ??? ??? ??? ?
?? ??? ?for(j=0;j<240;j++)
?? ??? ?{?? ?//printf("第%u行",j);
?? ??? ??? ?for(i=319;i>=0;i--)
?? ??? ??? ?{
? //高字節 數據位接的比較亂 根據實際情況修改
?? ??? ??? ??? ?OV7670_RCK_L;
?? ??? ??? ??? ?color = ((GPIOD->IDR&0xC000)>>14); ? //D14 D15
?? ??? ??? ??? ?color |= ((GPIOD->IDR&0x0003)<<2); ?//D0 D1
?? ??? ??? ??? ?color |= ((GPIOE->IDR&0x0780)>>3); ?//E7 8 9 10
?? ??? ??? ??? ?OV7670_RCK_H; ?? ??? ??? ??? ?
?? ??? ??? ??? ?color<<=8; ?
?? ??? ??? ??? ?OV7670_RCK_L;
?? ??? ??? ??? ?//低字節
?? ??? ??? ??? ?color |= ((GPIOD->IDR&0xC000)>>14); ? //D14 D15
?? ??? ??? ??? ?color |= ((GPIOD->IDR&0x0003)<<2); ?//D0 D1
?? ??? ??? ??? ?color |= ((GPIOE->IDR&0x0780)>>3); ?//E7 8 9 10?? ??? ??? ??? ?
?? ??? ??? ??? ?OV7670_RCK_H; ?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ?R = (color>>8)&0xF8;
?? ??? ??? ??? ?G = (color>>3)&0xFC;
?? ??? ??? ??? ?B = (color<<3)&0xF8;
?? ??? ??? ??? ?
?? ??? ??? ??? ?buffer[i*3+0] = R;//jpeg格式順序RGB 如果是bmp格式寫成BGR
?? ??? ??? ??? ?buffer[i*3+1] = G;
?? ??? ??? ??? ?buffer[i*3+2] = B;
?? ??? ??? ?}?? ??? ??? ?
?? ??? ??? ?jpeg_write_scanline(cinfo, buffer);//一行一行的壓縮
?? ??? ?}?
?? ??? ?jpeg_finish_compress(cinfo); ?
?? ??? ?jpeg_destory_compress(cinfo);
?? ??? ?//OV7670_CS=1;
??? ??? ?ov_sta=0;?? ??? ?//清零幀中斷標記
?? ??? ?//需要多少擦多少
? ? ? ? for(i = 0;i<=(pt_buf/4096);i++)
? ? ? ? {
? ? ? ? ? ? W25QXX_Erase_Sector( 8192/4096+i );
? ? ? ? }?? ???
?? ??? ?for(t = 0;t<pt_buf;t++)
?? ??? ?{
?? ??? ? send_data(JPG_enc_buf[t]);//發送數據給上位機? ? ? ? ??
?? ??? ?}? ? ??
? ? ? ? W25QXX_Write_NoCheck((u8*)JPG_enc_buf,FLASH_SIZE1,pt_buf);//寫到flash
?? ?}?
}
??
突然發現沒加源碼地址,補上:https://download.csdn.net/download/forwardjia/10633160
總結
以上是生活随笔為你收集整理的stm32驱动ov7670 数据转BMP格式再转JPEG存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [工具设置]xp iis连接数破解
- 下一篇: 【linux】free查看内存状态