顯示具有 樹梅派 標籤的文章。 顯示所有文章
顯示具有 樹梅派 標籤的文章。 顯示所有文章

2016年11月6日 星期日

OPENCV(7)--2D Convolution ,Image Filtering and Blurring (旋積,濾波與模糊)


        這篇介紹OPENCV提供的對影像作空間濾波的工具,透過2D Convolution(旋積或譯卷積),可以達到對影像作濾波的功能,而對影像實施低通濾波(LPF),實質上就是對影像作去除雜訊,模糊化的作用,而高通濾波(HPF)實質上對影像的作用就是銳利化,以及可以凸顯出影像的邊緣。

2D Convolution 

        跟信號一樣,我們也可以對 2D 圖像實施低通濾波(LPF),高通濾波(HPF)等。OpenCV 提供的函數 cv.ftlter2D() 可以讓我們對一幅圖像進行卷積操作。
如下圖<一>我們對一幅圖像做Convolution (旋積),底下是使用一個 3x3 kernel (核)的運算範例圖。

        操作如下:將核放在原圖像的一個像素A 上,求與核對應的圖像上 3x3個像素的和,用這個值替代像素 A 的值。重複以上操作直到 將圖像的每一個像素值都更新一遍。

圖<一>2D Convolution演算法

此圖來源:



2016年11月5日 星期六

人工神經網路(1)--使用Python實作perceptron(感知器)



        這篇文章介紹人工神經網路最基本的單元,perceptron(感知器)。使用最簡化的數學公式
說明,並利用Python語言實作單一感知器and 及or 的邏輯功能.

        1943年,Warren McCulloch 和Walter Pitts 提出了一簡單計算元素的神經元,這個思想現在仍然是大多數人工神經網路的基礎.
        如下<圖一>神經元接收了來自輸入連結的一些輸入信號(X1......Xn),這些輸入信號可以是原始資料或是其他神經元的輸出信號。輸出信號則可以是最終答案,也可以是其他神經元的輸入信號。
        神經元計算帶權重的輸入信號和並將結果和臨界值θ比較,如果網路淨輸入比臨界值低,則神經元輸出0,反之,如果網路淨輸入比臨界值低,則神經元輸出1。

<圖一>典型的神經元




        換言之,神經元使用下面的轉移或激勵函數.
其中X是神經元的淨權重輸入,Xi 是"輸入i"的值,Wi是"輸入i"的權重,
n是神經元輸入數量,Y是神經元的輸出。



2016年11月1日 星期二

OPENCV(6)--Trackbar(軌道桿)


    這篇介紹OPENCV提供的另一個基本工具Trackbar(軌道桿).可以用滑鼠拖拉改變特定的數值.
如下圖,拖拉 R,G,B Trackbar(軌道桿) 即可以更改,RGB顏色,範圍可以設定為0~255之間的數值.
Opencv 並沒有提供如Checkbox 這樣的工具,但是只要將Trackbar(軌道桿) 範圍值成0~1 ,也可以權當如checkbox的功能,當然如果需要更多一些GUI介面的元件,在Python 裡也可以利用別人提供的套件,如Tkinter ,或是PyQT 之類的.也可以跟OPENCV 套件整合在一起由Python實現.這就是Python 語言的便利性.


<圖一>當切換ON/OFF Trackbar(軌道桿) 在ON 位置時, 拉動R,G,B Trackbar(軌道桿)可以及時改變顏色




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年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當指令去結束視窗跟所有動作.
 




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




2016年7月21日 星期四

使用python與arduino連接控制LED


        這篇文章示範如何使用Python跟Arduino連結.並簡單的控制LED ON/OFF.
由於Python 是跨平台的程式語言所以可以安裝在一般電腦的windows上,也可以安裝在
使用Linux的系統如樹梅派.
   
         底下的範例程式是在一般的電腦windows 裡執行Python程式.
使用這樣的連結的好處在於分工,例如我們可以把影像識別或是語音識別建立在執行速度比較快的CPU上,如一般PC或是樹梅派,而把一些如機械手臂的動作或是資料感測建立在arduino端,透過Python 的套件Pyserial 就可以從Python端下自訂的文字命令去控制Arduino ,或是得到從Arduino端回傳過來的一些感測器數值資料.

        為什麼選擇Python?因為Python 語法簡單易學但是功能強大,並且世界上網路上都有開源的
原始碼可以參考.例如之前建立的OPENCV 做影像識別或是語音辨識都可以透過Python做到
,而只要再透過Pyserial 就可以控制Arduino做出如機器人方面的應用.
     
          而Python本身也有支援強大的網路功能,所以要做到IOT物聯網的功能,如從Arduino端得到感測器的資料再透過Python傳到網路伺服器或是從網路端得到指令透過Python傳給Arduino作一些控制也都是可以的.

       Python的功能還不只如此對於統計或是科學方面上的應用也是支援很多的套件可以使用,可以說Python 是功能全面性的程式語言但是又不如C++那樣複雜難懂.最主要的是網路幾乎都可以找到你想要的範例程式碼而且都是開源免費的.






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




2016年7月16日 星期六

Make Electric current stick game by Arduino (使用Arduino製作電流急急棒)


    這是用Arduino 自製的電流急急棒範例.
其實我主要是想要測試智能串口HMI 顯示屏的功能,剛好小朋友的媽媽有學校園遊會的活動
於是應老婆大人要求做了這個小專案.


<前面> 螢幕為一HMI panel 型號為TJC4832T035_011R.綠色阻礙棒子接在一顆MG 90伺服馬達上,當開始計時時,馬達會每隔3秒揮動一次,另外也可以在綠色棒子上再貼上鋁箔,並把鋁箔連接上路徑鋁箔,當急急棒碰觸時一樣可以做到導電失敗.


主要功能及製作說明:
1.有兩隻粗細不同的棒子可以選擇,原因是怕小朋友很難過關所以原本是用3DP印出一
   直徑1.5CM 的棒子,測試過覺得難度太高,所以又增加了一隻用竹筷的細棒子.

2.路徑寬度原本是規劃2.5CM ,但是由於木板不好切割所以不是很均勻,建議用瓦楞板或是
厚紙箱做地圖即可,然後在路徑上可以貼上會導電的烤箱用的鋁箔,我在鋁箔有貼上銅箔膠帶
當固定膠帶,銅箔膠帶電子材料行買的到,但是一捲要好幾百(不至於全部用完),只是用來固定鋁箔.我之前就有買了這次剛好可以用到.

3.左側為一起始紅外線感測器,右端為一終點紅外線感測器,這個感測器跟用來做尋跡車用的紅外線感測器是一樣的,當棒子經過感測器左端上方即會自動開始計時,在時限60秒內,棒子沒碰觸到即可過關.當棒子經過右端終點感測器時會自動感應.

4.中途有架設一伺服馬達接上一綠色棒子當阻礙,每隔3秒會揮動一次,當然時間是由程式控制,可以自行改成是改變時間.

5.使用一串口HMI 的觸控panel當顯示,基本上主用是用來顯示狀態及倒數計時,可以參考下面實際圖片的說明. ㄧ般來說要顯示數字也可以用七節顯示器來做,所以這個顯示屏並非必要也可以用七節顯示器替代,不過我提供的Arduino source code 只有我使用的HMI 處屏的code,如果用七節顯示器則這部分的code就要自行修改.

    PS.這個HMI觸屏為一USART傳輸可控制的螢幕,透過簡單的UART跟Arduino連線
  可以透過文字指令跟這個觸屏作互動切換顯示.事先在HMI 觸屏提供的控件軟體編輯好
切換畫面或是按鈕或是文字欄,再透過UART序列傳輸指令即可以跟Arduino作互動.
  可以在掏寶上搜尋 "hmi觸摸屏"即可找到相關產品,至於使用方式,通常賣家都會提供資料.

2016年5月23日 星期一

How to install OPENCV in Raspbarry pi 3.(如何在樹梅派上安裝OPENCV)

    這篇來記錄如何安裝OPEVCV 在Raspbarry pi 3 上.

  使用OS :Ubuntu MATE 16.04,請參照前兩篇有關Raspbarry pi 3的安裝.

(1)How to install Ubuntu Mate 16.04 in Raspbarry Pi 3(如何在Raspbarry pi 3安裝Ubuntu 16.04)
http://arbu00.blogspot.tw/2016/05/how-to-install-ubuntu-mate-1604-in.html

(2)How to install SSH,WinSCP and VNC in Raspbarry pi 3(如何在Raspbarry pi 3安裝SSH,WinSCP,VNC)
http://arbu00.blogspot.tw/2016/05/how-to-install-sshwinscp-and-vnc-in.html

   接下來會說明如何安裝OPENCV 以及匯入OPENCV 到Python 3.x 語言上,透過Python
即可以操作OPENCV 的功能.OPENCV原本是Intel 內部的一個計劃專案,主要可以從事影像處裡及辨識,如人臉辨識,也包含了一些機器學習,統計,類神經網路的功能.是一個強大好用的開源API.原本的OPENCV 是由C/C++的開源碼寫成. 底下透過一些方式可以將OPENCV 編譯成一個.so檔.即可以匯入Python 3 語言中使用.最後實作一個範例可以辨識出圖片的紅色區塊並將其圈起來.