2016年10月27日 星期四

OPENCV(5)--Drawing



    這篇介紹OPENCV提供的的基本畫圖工具.主要是可以應用在影像辨識出輪廓或特徵時
圈選或標註之用.

<圖1>

    首先使用Numpy 產生一黑底圖矩陣img , 512x512 像素當畫布
       程式如下,3為channel (B,G,R) =(0,0,0)
       img = np.zeros((512,512,3), np.uint8)

1.畫直線:
       OENCV 函式:  cv2.line(img,(20,20),(500,500),(255,0,0),5)
        *1. 畫在img 圖像
        *2. 給定對角兩點(20,20),(500,500) 
        *3. 給定線條顏色(255,0,0) 為(B,G,R) 所以為一藍色線
        *4. 5:為設定的線寬,預設為1 ,值越大線條越粗

2.畫矩形:
        OENCV 函式:  cv2.rectangle(img,(25,25),(400,400),(0,255,0),4)
        *1. 畫在img 圖像
        *2. 給定對角兩點(25,25),(400,400) 
        *3. 給定線條顏色(0,255,0)為(B,G,R) 所以為一綠色線
        *4. 4:為設定的線寬,預設為1 ,值越大線條越粗

OPENCV(4)--Grayscale,Binarization,Threshole(灰階化,二值化,閥值)


    這篇簡單的介紹OPENCV的灰階化(Grayscale),二值化(Binarization),閥值(Threshole)

灰階化(Grayscale):顧名思義將原本讀取進來原本具有B.G.R三個頻道的彩圖,轉換成只有
    一個頻道為0-255,的黑白值分佈,由值0為最黑到255為最白.處於中間的即為漸黑或漸白
   如<圖1 >讀進一原圖為藍白漸層圖,轉成灰階值後呈現在圖中Gray
如果要將讀取進來的圖片做灰階化有兩種方式
a. 在使用 cv2.imread()讀圖時,將第二參數設為0,這樣讀取的img即為灰階化後的圖形矩陣
EX:     img = cv2.imread('bl2w.jpg',0)
b. 使用cv2.cvtColor(),將原圖讀進來的矩陣放置第一參數位置
    將第二參數設為cv2.COLOR_BGR2GRAY
EX:gray=cv2.cvtColor(img_RGB,cv2.COLOR_BGR2GRAY)
    那麼原本img_RGB如果為一BGR 圖檔即可轉成灰值圖矩陣gray

在Python裡處理影像矩陣式利用Numpy矩陣物件來處理.
而Numpy 提供一個.shape 屬性,使用此屬性可得知該矩陣的大小及維數.
如下圖2,在紅色框框裡img_RGB.shape 為(256,256,3) 其256x256 為其圖片像素rows,clos值
也是像素解析度大小,而3代表R.G.B 三通道.
而img_RGB.shape 為(256,256) 代表灰階化後只剩一通道像素解析度大小仍然是256x256.

<圖1>





2016年10月22日 星期六

OPENCV(3)--Matplotlib pyplot bassic function


    這篇簡單的介紹Matplotlib的基本用法,主要可以用來秀圖特別是可以畫出函數或是矩陣元素圖形,以利我們做數學上的分析,他的功能類似於有名的Matlab軟體.

底下分別畫出三種圖.



第一個放置在最左邊,單純任意輸入一維陣列
y=[1,3,5,7,9,12,16,22]     #隨便輸入幾個數字
x=[0,1,2,3,4,5,6,7]           #X 軸序號
那利用plt.plot 即可畫出該圖,也就是我可以從圖視覺畫的看出y陣列分布的狀況
至於'ro' 參數,r 代表紅色o 代表畫出圓點,
plt.plot(x,y,'ro')
而底下另一方式'b-',b 代表藍色,-代表線段
plt.plot(x,y,'b-', linewidth=3.0)
除了o,-可以使用外
('o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd')   都是可以使用的特定符號
x,y則分別是輸入的x陣列及y陣列
linewidth=3.0  可以指定線寬,數字越大線越粗

2016年10月21日 星期五

OPENCV(2)--Capture Video from Camera


    這篇介紹如何透過OPENCV 開啟電腦上的Webcam 擷取影像並做灰階化後及時同步顯示影像. 
     video可以看成是一段時間內幾十張單一影像的連續呈現,如30FPS(Frames per second) 就是每秒30張影像,因為人眼視覺暫留的作用,所以在我們看起來它就變成了動畫.所以camera擷取進的影像也是一張一張的圖片,而我們也可以直接對這一張張的影像圖片連續做處裡如灰階化.所以在OPENCV處理video的影像跟單一張圖片的影像並沒有區別.
     底下圖(1) 左邊即為webcam讀取的原始影像,右邊為灰階化後的即時影像

<圖1>



從程式碼中觀看,frame即為從webcam 讀取的單張影像,而只要連續對讀取的frame做處理即可
顯示即時處理後的影像結果.當然電腦的CPU/GPU處理的速度,會直接影響處理效率.
一般使用預設的的640x480 來做處理即可,即使未來對影像特徵值得處理也不需太高解析度的影像,甚至更小解析度32x32 就夠了.

     要在OPENCV裡使用Webcam 只要底下一行程式即可
     預設電腦的webcam 代號0
     cap = cv2.VideoCapture(0)

2016年10月19日 星期三

OPENCV(1 )--How to install OPENCV in Python


   This page show how to install OPENCV in Python.

A.In windows
1.先下載及安裝Python 2.7 or 3.x
       https://www.python.org/downloads/

      雖然很多人還是愛用python2.7版,但是我還是建議安裝Python3.x 版
      安裝時記得將底下add python 3.5 to path 打勾,至於安路徑目錄可以自行修改到
     任一磁碟都可以.




安裝好之後,直接開啟Dos 命令視窗.直接打python  按Enter ,應該會出現如下畫面
表示python 安裝成功,



2016年9月24日 星期六

使用中文語音下令機器人去控制家裡的電燈



      使用中文語音下達指令給機器人,讓機器人去控制家裡的電燈.
原本的範例也可以直接利用手機平板或是電腦直接做控制家裡的電燈,這次利用
Google語音辨識的功能,讓機器人去完成該指令動作,一來是省去了必須另外打開手機電腦
的麻煩,二來是讓機器人比較像是家裡一份子的感覺. 是機器人與物聯網概念的結合,其運用也可以用在其他家電如電視,電風扇,冷氣,電子鎖等等.

<圖一>系統概念圖


<圖二>阿布拉機機器人



<圖三>辨識語音輸出文字



影片DEMO:

2016年9月11日 星期日

ESP8266 WIFI(6) -Using Python to control LED ON/OFF




這篇介紹如何用Python 語言透過ESP8266 Wifi連線去控制Arduino 端的LED.

<圖一概念圖>





<圖二> 下圖是Python GUI 程式執行時,及Arduino 端LED實際運作狀態.
              當按下分別對應的LED按鈕後,LED即會 ON/OFF 動作. 



2016年9月2日 星期五

ESP8266 WIFI(5) -Set LED ON/OFF from WEB browser


 這篇文章介紹如何在瀏覽器透過ESP8266 wifi連線控制Arduino上的LED 開關.


<圖1>概念圖,非完整接線圖


<圖2>實際工作狀態



首先請先參閱之前的ESP8266介紹完成基本接線及測試,

ESP8266 Wifi (1)---Connected with PC.

http://arbu00.blogspot.tw/2015/12/esp8266-wifi-1-connected-with-pc.html
ESP8266 WIFI(2) -update firmware and modify baud rate.

2016年7月29日 星期五

使用Python透過Bluetooth與Arduino連結


        這篇文章示範如何使用Python透過Bluetooth跟Arduino連結.並使用Python建立出來的圖形介面來控制Arduino上LED 的ON/OFF.
 底下實驗概念接線圖

   Python 因為是跨平台的程式語言所以也執行在windows或是Linux,底下範例是直接使用一般電腦及windows 10去做示範.Python原始程式碼只要稍微修改一下也可以改成使用在安裝Linux的系統上,如樹梅派.


底下是之前USB2Serial範例的介紹連結:
http://arbu00.blogspot.tw/2016/07/pythonarduinoled.html




    底下所建立出來的圖形介面如下圖所示,
當按下按鈕<check>去跟Arduino確認是否已經連線成功.
按下按鈕<ButtonA>則會傳送字元'a' 到arduino當指令去啟動LED跑馬燈1
按下按鈕<ButtonB>則會傳送字元'b' 到arduino當指令去啟動LED跑馬燈2
按下按鈕<ButtonC>則會傳送字元'c' 到arduino當指令去啟動LED閃燈的動作.
按下按鈕<Exit>則會傳送'ESC' 鍵字元到arduino當指令去結束視窗跟所有動作.
當成是執行時必須先按下<Check>Button 再reset Arduino才能順執行以確保連線成功.
 


底下圖示當按下Button A 時會傳字元'a' 到Arduino,即可進行跑馬燈動作.
 




2016年7月26日 星期二

使用python與arduino連接控制LED之GUI圖形介面


        這篇文章示範如何使用Python跟Arduino連結.並使用Python建立出來的圖形介面來控制
Arduino上LED 的ON/OFF.

底下是第一個範例的介紹連結:
http://arbu00.blogspot.tw/2016/07/pythonarduinoled.html

    所建立出來的圖形介面如下圖所示,按下按鈕<Connect>去跟Arduino確認是否連線成功.
按下按鈕<ButtonA>則會傳送字元'a' 到arduino當指令去啟動LED跑馬燈1
按下按鈕<ButtonB>則會傳送字元'b' 到arduino當指令去啟動LED跑馬燈2
按下按鈕<ButtonC>則會傳送字元'c' 到arduino當指令去啟動LED閃燈的動作.
按下按鈕<Exit>則會傳送'ESC'鍵 字元到arduino當指令去結束視窗跟所有動作.
 




有關這個範例的實際示範及詳細的說明可以觀看底下的影片教學.