找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5332|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

stm32源碼 ov7725二值化并能返回圓的圓心

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:250245 發(fā)表于 2018-6-3 15:25 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
這是我自己寫的ov7725二值化程序并能返回圓的圓心,不喜勿噴,希望有大佬有更好的程序分享過來

單片機(jī)源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "string.h"
  8. #include "ov7725.h"
  9. #include "ov7670.h"
  10. #include "tpad.h"
  11. #include "timer.h"
  12. #include "exti.h"
  13. #include "usmart.h"

  14. //由于OV7725傳感器安裝方式原因,OV7725_WINDOW_WIDTH相當(dāng)于LCD的高度,OV7725_WINDOW_HEIGHT相當(dāng)于LCD的寬度
  15. //注意:此宏定義只對OV7725有效
  16. #define  OV7725_WINDOW_WIDTH                320 // <=320
  17. #define  OV7725_WINDOW_HEIGHT                240 // <=240


  18. const u8*LMODE_TBL[6]={"Auto","Sunny","Cloudy","Office","Home","Night"};//6種光照模式            
  19. const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"};        //7種特效
  20. extern u8 ov_sta;        //在exit.c里 面定義
  21. extern u8 ov_frame;        //在timer.c里面定義

  22. //更新LCD顯示(OV7725)
  23. void OV7725_camera_refresh(void)
  24. {
  25.         u32 i,j;
  26.          u16 color;         
  27.         double X_FLAG=0.0,Y_FLAG=0.0;
  28.         int        NUM_X=0,NUM_Y=0;
  29.         char FlagStatus;
  30.         if(ov_sta)//有幀中斷更新
  31.         {
  32. //                u8 R=0x00,G=0x00,B=0x00;
  33. //        u16 RGB_Color=0x0000;
  34. //        float Max=0,Min=0;
  35. //        float Rhsv=0,Ghsv=0,Bhsv=0;
  36. //        float H=0,S=0,V=0;
  37. //               
  38. //               
  39. //        volatile u16 gray;
  40. //        u8 gm_red,gm_green,gm_blue;
  41.                 LCD_Scan_Dir(U2D_L2R);//從上到下,從左到右
  42.                 LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT);//將顯示區(qū)域設(shè)置到屏幕中央
  43.                 if(lcddev.id==0X1963)
  44.                         LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//將顯示區(qū)域設(shè)置到屏幕中央
  45.                 LCD_WriteRAM_Prepare();     //開始寫入GRAM        
  46. /*******/               
  47.                 OV7725_RRST=0;                                //開始復(fù)位讀指針
  48.                 OV7725_RCK_L;
  49.                 OV7725_RCK_H;
  50.                 OV7725_RCK_L;
  51.                 OV7725_RRST=1;                                //復(fù)位讀指針結(jié)束
  52.                 OV7725_RCK_H;
  53.                 for(i=0;i<240;i++,FlagStatus=0)
  54.                 {
  55.                         for(j=0;j<OV7725_WINDOW_WIDTH;j++)
  56.                         {
  57. //                                OV7725_RCK_L;
  58. //                                color=GPIOC->IDR&0XFF;        //讀數(shù)據(jù)
  59. //                                OV7725_RCK_H;
  60. //                                color<<=8;  
  61. //                                OV7725_RCK_L;
  62. //                                color|=GPIOC->IDR&0XFF;        //讀數(shù)據(jù)
  63. //                                OV7725_RCK_H;
  64. //                                R=color&0x001f;
  65. //                                G=(color&0x0770)>>5;
  66. //                                B=(color&0xf800)>>11;
  67. //                        gm_red = (color & 0xF800) >> 8;
  68. //                        gm_green = (color & 0x07E0) >> 3;
  69. //                        gm_blue = (color & 0x001F) << 3;
  70. //                        gray =(gm_red*77+gm_green*150+gm_blue*29+128)/256;
  71. //                        gray=gray/8;
  72. //                        color=(0x001f&gray)<<11;
  73. //                        color=color|(((0x003f)&(gray*2))<<5);
  74. //                        color=color|(0x001f&gray);
  75.                                 /*********/
  76.             if((i>=20&&i<220)&&(j>=20&&j<220))//100*100               
  77.                                                         {                OV7725_RCK_L;
  78.                                                         color=GPIOC->IDR&0XFF;        //YUYV輸出讀數(shù)據(jù)  不讀第二個字節(jié)
  79.                                                         OV7725_RCK_H;
  80.                                                         //color<<=8;  
  81.                                                         OV7725_RCK_L;
  82.                                                         //color|=GPIOC->IDR&0XFF;        //讀數(shù)據(jù)
  83.                                                         OV7725_RCK_H;                                                
  84.                                                                         if(color>0x5F)
  85.                                                                         {
  86.                                                                         color=0xffff;//白色  
  87.                                                                         }                                                                                
  88.                                                                         else
  89.                                                                         {
  90.                                                                         FlagStatus=1;
  91.                                                                         NUM_Y++;
  92.                                                                         Y_FLAG+=j;
  93.                                                                         color=0x0000;//黑色               
  94.                                                                         }                                                                                
  95.                                                      LCD->LCD_RAM=color;  
  96.                                                         }
  97.                                                         else
  98.                                                         {
  99.                                                         OV7725_RCK_L;
  100.                                                         OV7725_RCK_H;
  101.                                                         OV7725_RCK_L;
  102.                                                         OV7725_RCK_H;
  103.                                                         LCD->LCD_RAM=0xffff;
  104.                                                         }
  105.                                                            
  106.                
  107.                                 
  108.                                 
  109. //                                LCD->LCD_RAM=color;  
  110. //                                /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓RGB轉(zhuǎn)HSV算法↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
  111. //                Rhsv = (float) R/25/10;        //RGB轉(zhuǎn)換成0,1.
  112. //                Ghsv = (float) G/25/10;         
  113. //                Bhsv = (float) B/25/10;

  114. //                Max = (Rhsv>Ghsv)?Rhsv:Ghsv;        
  115. //                Max = (Max>Bhsv)?Max:Bhsv;                //取RGB最大值                                 
  116. //                Min = (Rhsv<Ghsv)?Rhsv:Ghsv;                                                                  
  117. //                Min = (Min<Bhsv)?Min:Bhsv;                //去RGB最小值                                         
  118. //                                                               
  119. //                if(Rhsv==Max) H = (Ghsv-Bhsv)/(Max-Min);                                                  
  120. //                if(Ghsv==Max) H = 2+(Bhsv-Rhsv)/(Max-Min);                                                         
  121. //                if(Bhsv==Max) H = 4+(Rhsv-Ghsv)/(Max-Min);                                                        
  122. //                H =(int) (H*60);                                //取H的數(shù)值                                                                                          
  123. //                if(H<0) H = H+360;                                                                                                                                                                                                                                                                        
  124. //                V = (Rhsv>Ghsv)?Rhsv:Ghsv;                                                                                                
  125. //                V = (V>Bhsv)?V:Bhsv;                //取V的數(shù)值                                                                                                                                                                                                                                          
  126. //                S = (Max-Min)/Max;                        //取S的數(shù)值                                                                                                                                                                                                                                                
  127. //                V = (int) (V*100);                                                                                                                        
  128. //                S = (int) (S*100);
  129. //                /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑RGB轉(zhuǎn)HSV算法↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/               
  130.                         }
  131.                         if(FlagStatus==1)
  132.                         {
  133.                         NUM_X++;
  134.                         X_FLAG+=i;
  135.                         }
  136.                 }
  137.                 Y_FLAG/=NUM_Y;
  138.                 X_FLAG/=NUM_X;
  139.                  ov_sta=0;                                        //清零幀中斷標(biāo)記
  140.                 ov_frame++;
  141.                 /****/
  142.                 LCD_Scan_Dir(DFT_SCAN_DIR);        //恢復(fù)默認(rèn)掃描方向
  143.                 printf("X=%dY=%d\r\n",(int)X_FLAG,(int)Y_FLAG);        //打印幀率
  144.                 POINT_COLOR=WHITE;
  145.                 LCD_Draw_Circle((int)X_FLAG,(int)Y_FLAG,2);
  146.         }
  147. }

  148. int main(void)
  149. {         
  150.         u8 lightmode=0,effect=0;
  151.         s8 saturation=0,brightness=0,contrast=0;
  152.          
  153.         delay_init();                             //延時函數(shù)初始化         
  154.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  155.         LCD_Init();                                           //初始化LCD  
  156.         uart_init(115200);
  157.         OV7725_Init();
  158.         OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//VGA模式輸出
  159.         OV7725_Light_Mode(lightmode);
  160.         OV7725_Color_Saturation(saturation);
  161.         OV7725_Brightness(brightness);
  162.         OV7725_Contrast(contrast);
  163.         OV7725_Special_Effects(effect);
  164.         OV7725_CS=0;
  165.         SCCB_WR_Reg(0xa6, 0x26);
  166.         SCCB_WR_Reg(0x60, 0x80);
  167.         SCCB_WR_Reg(0x61, 0x80);//黑白
  168.         TIM6_Int_Init(10000,7199);
  169.         
  170.         EXTI8_Init();                                //使能定時器捕獲                                
  171.          while(1)
  172.         {        
  173.                 OV7725_camera_refresh();//更新顯示
  174.          }   
  175. }
復(fù)制代碼

所有資料51hei提供下載:
(庫函數(shù)版本,適合戰(zhàn)艦STM32F1開發(fā)板)實(shí)驗(yàn)35 攝像頭實(shí)驗(yàn).rar (447.82 KB, 下載次數(shù): 124)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

來自 2#
ID:250245 發(fā)表于 2018-6-4 13:58 | 只看該作者
得到圓形坐標(biāo)部分我的想法是計算出LCD屏上的所有黑點(diǎn)的位置的平均值,這樣能夠得到準(zhǔn)確的坐標(biāo),但是缺點(diǎn)就是這樣做由于運(yùn)算量大會降低攝像頭的幀率,而且如果屏幕上出現(xiàn)了其他地方有黑點(diǎn)就會造成圓心坐標(biāo)的誤
網(wǎng)上有一個用于處理黑線的算法,我覺得可以在這里用到。以下是我從網(wǎng)上找來的:

6.  對一行中的數(shù)據(jù),進(jìn)行提取黑線的算法使用:邊沿提取法。該算法對黑線反應(yīng)靈敏、準(zhǔn)確度高、抗干擾能力強(qiáng)。
7.  邊沿提取算法步驟:對于每一行的像素,從左往右,檢測高電平到低電平的負(fù)跳變,那么這時就檢測到了左邊的黑線邊界,接著繼續(xù)開始往右檢測,出現(xiàn)低電平到高電平的跳變時,就出現(xiàn)了正跳變(1111000)的時候,就檢測到了右邊黑線的邊界。(這里的高電平和低電平分別指代白色和黑色像素值)。  這時候就可以通過黑線的位置比較與攝像頭軸線的偏離,那么就可以將相對的偏離計算出來。
8.  圖像幀的處理:雖然邊沿提取算法可以粗略的控制小車,但是當(dāng)出現(xiàn)其他干擾信號時,可能會影響控制信號。那么解決辦法就是將上面獲取的每一行像素中黑色點(diǎn)位置進(jìn)行干擾濾波,也就是幀處理。
9.  在幀數(shù)據(jù)的處理中,采用的算法是:提取連續(xù)段的方法,去掉圖像中無用的錯誤數(shù)據(jù)。
10.           連續(xù)段提取算法的大致流程:1)提取以行為標(biāo)準(zhǔn),如果隔著某些行,各個黑點(diǎn)之間的垂直距離是某種固定或者接近固定的閥值,那么這些連續(xù)的點(diǎn),就構(gòu)成了一段連續(xù)段。最好提取三個連續(xù)段。2)提取三個端中,再在其中最為可靠的端,例如上圖中的連續(xù)段3,也就是這個段中,所包含的連續(xù)點(diǎn)越多越可靠。3)然后將可用端連起來,成為一個大段?梢詫⒉豢煽慷问褂貌逖a(bǔ)的方法歸算到大段中。
 差很大;


我的想法是這樣的,由于攝像頭的圖像是從上往下再從左往右掃描的,我們可以一列一列的來對像素點(diǎn)進(jìn)行處理,先看第一列,檢測是否有負(fù)跳變(00001111白為0黑為1)那么就有可能檢車到了圓,那么在檢測正跳變,記錄下坐標(biāo),這樣我們就將第一行像素點(diǎn)的圓形部分得出來了。那么依次類推就可得出圓形的邊界位置,在這個過程中肯定是有誤判的;那么根據(jù)網(wǎng)友的說法,可以將偏離其他邊界很遠(yuǎn)的坐標(biāo)去掉酒可以得到圓形大致的邊界了,最后就是圓心的計算,這也可以采用計算平均值的方法,當(dāng)然還可以隨即采取三個點(diǎn)因此我們要求的就是這三個點(diǎn)構(gòu)成三角形的外接圓球心,從幾何來說三角形外心是三角形三條邊垂直平分線的交點(diǎn),具體求法可以用兩邊的乘積除以第三邊上的高(這樣求出來是外接圓直徑),直徑出來了圓心就好求了。

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:341045 發(fā)表于 2018-6-4 08:05 | 只看該作者
正在作OV7725的東東, 參考下, 謝謝分享
回復(fù)

使用道具 舉報

地板
ID:353347 發(fā)表于 2018-6-21 13:00 | 只看該作者
本帖最后由 17190187950 于 2018-6-21 13:24 編輯

謝謝分享
請問圓心坐標(biāo)是什么,怎么輸出?
回復(fù)

使用道具 舉報

5#
ID:7922 發(fā)表于 2018-6-21 13:14 | 只看該作者
參考下, 謝謝分享
回復(fù)

使用道具 舉報

6#
ID:250245 發(fā)表于 2018-6-23 20:21 | 只看該作者
lzts88 發(fā)表于 2018-6-4 08:05
正在作OV7725的東東, 參考下, 謝謝分享

用串口接收
回復(fù)

使用道具 舉報

7#
ID:367587 發(fā)表于 2018-7-9 00:01 | 只看該作者
你好,這個源碼有嗎,能不能分享下
回復(fù)

使用道具 舉報

8#
ID:367587 發(fā)表于 2018-7-9 00:02 | 只看該作者
wangxianlong 發(fā)表于 2018-6-4 13:58
得到圓形坐標(biāo)部分我的想法是計算出LCD屏上的所有黑點(diǎn)的位置的平均值,這樣能夠得到準(zhǔn)確的坐標(biāo),但是缺點(diǎn)就 ...

你好,這個源碼能給我們提供下嗎?
回復(fù)

使用道具 舉報

9#
ID:379752 發(fā)表于 2018-7-27 10:30 | 只看該作者
樓主好厲害
回復(fù)

使用道具 舉報

10#
ID:530797 發(fā)表于 2019-5-11 11:37 | 只看該作者
mini版可以用嗎
回復(fù)

使用道具 舉報

11#
ID:585168 發(fā)表于 2019-7-16 15:44 | 只看該作者
為什么我用了這個程序下載到32里面,復(fù)位或者重啟以后程序就不能運(yùn)行了呢
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表