久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

單片機源程序如下:
  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相當于LCD的高度,OV7725_WINDOW_HEIGHT相當于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ū)域設置到屏幕中央
  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ū)域設置到屏幕中央
  45.                 LCD_WriteRAM_Prepare();     //開始寫入GRAM        
  46. /*******/               
  47.                 OV7725_RRST=0;                                //開始復位讀指針
  48.                 OV7725_RCK_L;
  49.                 OV7725_RCK_H;
  50.                 OV7725_RCK_L;
  51.                 OV7725_RRST=1;                                //復位讀指針結(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;                                        //清零幀中斷標記
  140.                 ov_frame++;
  141.                 /****/
  142.                 LCD_Scan_Dir(DFT_SCAN_DIR);        //恢復默認掃描方向
  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);//設置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應優(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. }
復制代碼

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


評分

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

查看全部評分

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

使用道具 舉報

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

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


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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

謝謝分享
請問圓心坐標是什么,怎么輸出?
回復

使用道具 舉報

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

使用道具 舉報

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

用串口接收
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲乱码一区二区三区在线观看 | www.久| 婷婷亚洲综合 | 国产精品久久久久无码av | 91精品久久 | 在线中文字幕国产 | 欧美精品在欧美一区二区 | 亚洲三级视频 | 国产成人高清视频 | 国产精品区一区二 | 亚洲成av人片在线观看 | 亚洲色图图片 | 一级黄色毛片子 | 久久久久久亚洲精品 | 香蕉久久a毛片 | 91精品国产高清一区二区三区 | 亚洲精品乱码久久久久久按摩观 | 欧美精品一区二区三区视频 | 欧美日韩在线精品 | 国产精品美女久久久久久免费 | 伊人精品一区二区三区 | 波多野吉衣在线播放 | 色婷婷综合成人av | 国产ts一区 | 国产精品日韩一区二区 | 亚洲精品乱码久久久久久久久久 | 91精品久久久 | 一区二区三区四区免费视频 | 欧美女优在线观看 | 精品国产乱码久久久久久丨区2区 | 午夜激情网 | 91精品一区二区三区久久久久久 | 欧美一级毛片在线播放 | 亚洲色图综合 | 日韩一区二区久久 | 欧美成人a∨高清免费观看 欧美日韩中 | 亚洲欧美成人影院 | 欧美日韩视频在线 | 国产精品一二三区在线观看 | 狠狠操狠狠操 | 国产精品看片 |