Sunday, May 31, 2015

JPG轉換成TIFF格式的OCR與的tesseract

首先安裝pip套件
sudo apt-get install python-pip
透過pip下載PIL套件
sudo pip install PIL
如果不能執行
pip install PIL --allow-unverified PIL --allow-all-external
接下來安裝 tesseract-ocr 套件
sudo apt-get install tesseract-ocr
安裝PyTesser
wget https://pytesser.googlecode.com/files/pytesser_v0.0.1.zip
將檔案解壓縮
unzip pytesser_v0.0.1.zip -d pytesser
cd pytesser
convert fonts_test.png -auto-level -compress none myimage.tif
如果不能執行
sudo apt-get install imagemagick
fonts_test.png => 輸入辨識圖片
 myimage.tif => 產生出來的檔案 
 執行完之後會產生myimage.tif檔案 再來建立一個demo.py檔案來觀看辨識結果,內容如下:
from PIL import Image
from pytesser import *


image_file = 'myimage.tif'
im = Image.open(image_file)
text = image_to_string(im)
text = image_file_to_string(image_file)
text = image_file_to_string(image_file, graceful_errors=True)
print "=====output=======\n"
print text
檔案請自行跟改檔名~ 執行demo.py檔案(執行時間依電腦硬體而定)
python demo.py
參考資料:
https://www.youtube.com/watch?v=LRXS3mC0OKo 
http://fosshelp.blogspot.tw/2013/04/how-to-convert-jpg-to-tiff-for-ocr-with.html

Saturday, May 30, 2015

Rasberry pi install opencv

這裡介紹如何在 Raspberry Pi 上面安裝 OpenCV 函式庫,安裝方式可選擇使用 apt 或是自行編譯安裝。本章選用apt安裝。


使用 Apt 安裝 OpenCV

STEP1
如果要在 Raspberry Pi 中安裝與使用 OpenCV,最方便的方式就是使用 apt 來安裝:


sudo apt-get install libopencv-dev
STEP2 
安裝編譯 OpenCV 所需要的套件:
sudo apt-get install build-essential cmake cmake-curses-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools libeigen3-dev
需要的套件很多,這是另外一部分:
sudo apt-get install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev
STEP3
直接使用 Git 下載:
git clone https://github.com/Itseez/opencv.git
STEP4
進入 OpenCV 的原始碼目錄,建立一個編譯用的子目錄
cd opencv
mkdir release
cd release
使用 ccmake 建立 CMake 設定檔:
ccmake ../
由於我們建立的是一個全新的編譯設定,所以會顯示 Empty Cache,直接按下「c」繼續。

接著會出現所有可以調整的選項,您可以依照自己的需求來修改。

修改完後,按下「c」設定新的選項,然後再按下「g」即可產生編譯用的設定檔案。
STEP5 進行編譯:
make
sudo make install
由於 Raspberry Pi 的處理速度很慢,所以編譯的過程會需要很久的時間,大該需要十個小時左右。在編譯的過程會需要大約 2G 的空間,所以也要注意一下 Raspberry Pi 的記憶卡所剩餘的空間是否充足。 檢查方式:
df -h
檢查opencv版本:
pkg-config --modversion opencv
OpenCV Hello World 安裝好 OpenCV 函式庫之後,接著寫一個小的程式測試一下:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv ) {
    if( argc != 2) {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }
    Mat image;
    // Read the file
    image = imread(argv[1], CV_LOAD_IMAGE_COLOR);
    if(! image.data ) { // Check for invalid input
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }
    // Create a window for display.
    namedWindow( "Display window", WINDOW_AUTOSIZE );
    // Show our image inside it.
    imshow( "Display window", image );
    // Wait for a keystroke in the window
    waitKey(0);
    return 0;
}
我將這個顯示圖片的程式碼儲存為 display_image.cpp,然後使用 g++ 編譯:
g++ -lopencv_highgui -lopencv_core -o display_image display_image.cpp
編譯時要加上連結用的函式庫 -lopencv_highgui -lopencv_core,如果不清楚該加哪些,可以直接使用 pkg-config 把所有的 OpenCV 函式庫都放進去:
g++ `pkg-config --libs opencv` -o display_image display_image.cpp
如果可以正常編譯出來 display_image 這個執行檔,就表示 OpenCV 已經安裝成功了,這個測試程式可以顯示指定的圖檔:
./display_image xxx.jpg
參考資料:
http://blogger.gtwang.org/2015/01/raspberry-pi-install-opencv.html

Tuesday, May 26, 2015

X Window遠端桌面

將作業系統安裝好了之後,難免會遇到一個狀況:旁邊沒有 HDMI 介面或是 S 端子的螢幕,可是又偏偏需要用到圖形介面 (GUI),也就是 X-Window 來操作。 遠端遙控的工具有很多種,這次我們用的是遠端桌面協定 (Remote Desktop Protocol),而在 Linux 平台上面最好的選擇就是 xrdp 套件了。

直接從 Raspbian 官方套件庫安裝即可。
sudo apt-get -y install xrdp

遠端連線 - Windows

這裡以 Windows 7 來做示範,因為 Windows 已經內建連線程式,所以不須額外安裝;它的捷徑在「開始」-「所有程式」-「附屬應用程式」-「遠端桌面連線」

Thursday, May 21, 2015

Rasberry-從Web控制GPIO

  1. Python和GPIO
  2. Python,FastCGI的和Web服務器
  3. HTML和Javascript

Python和GPIO

RPi.GPIO Python庫被捆綁了Linux的Raspbian,所以我們只使用現在讓事情變得簡單。以下Python代碼將配置的GPIO管腳7(GPIO4)輸出,然後打開它。這段代碼以root身份運行,所以你需要將它保存到一個文件,然後用運作它:

Python,FastCGI的和Web服務器

我們需要把樹莓派變成一個Web服務器,然後在其上創建一個小網站
安裝Web服務器並開始運作它使用:
sudo apt-get install lighttpd
sudo service lighttpd start
lighttpd用一個網站,在目錄/ var / WWW。我們可以建立我們自己的網站在那裡創建一個新的文件/var/www/index.html
<html>
  <head>
    <title>Hello from the Pi</title>
  </head>
  <body>
    <h1>Hello world from the Raspberry Pi</h1>
  </body>
</html>
現在,當我們點一個網頁瀏覽器在樹莓派的IP地址,如http://192.168.1.104/(替換你自己的IP地址到該網址),你應該得到的Hello World消息出現
為了我們的Python掛接到網絡服務器,我們需要安裝一個庫,與FastCGI協議幫助
sudo apt-get install python-flup
然後我們改變python腳本採從Flup而不是從它進行raw_input輸入()等,作為root用戶運行。將下面的腳本/var/www/doStuff.py,然後執行命令chmod 755這樣的網絡服務器可以執行它。 sudo chmod 755 doStuff.py
#!/usr/bin/pythonRoot
# bring in the libraries
import RPi.GPIO as G     
from flup.server.fcgi import WSGIServer 
import sys, urlparse
 
# set up our GPIO pins
G.setmode(G.BOARD)
G.setup(7, G.OUT)
 
# all of our code now lives within the app() function which is called for each http request we receive
def app(environ, start_response):
  # start our http response 
  start_response("200 OK", [("Content-Type", "text/html")])
  # look for inputs on the URL
  i = urlparse.parse_qs(environ["QUERY_STRING"])
  yield (' ') # flup expects a string to be returned from this function
  # if there's a url variable named 'q'
  if "q" in i:
    if i["q"][0] == "w": 
      G.output(7, True)   # Turn it on
    elif i["q"][0] == "s":
      G.output(7, False)  # Turn it off
 
#by default, Flup works out how to bind to the web server for us, so just call it with our app() function and let it get on with it
WSGIServer(app).run()
在/ usr / bin中/ Python的可執行文件運行的調用它的用戶。這很可能是任一“pi”用戶,如果你以交互方式使用它,或在“WWW的數據”用戶,如果是由web服務器上運行。易於配置的違反此安全的方法是將用戶的Linux的setuid的功能。這是一個潛在的危險的技術,所以需要一點心思縝密的,但很容易建立。
我們找出哪個版本的Python,然後做出一個副本命名的/ usr / bin中/ pythonRoot並使其運行setuid root的:
  pi@raspberrypi /var/www $ ls -l /usr/bin/python
  lrwxrwxrwx 1 root root 9 Jun  6  2012 /usr/bin/python -> python2.7
  pi@raspberrypi /var/www $ sudo cp /usr/bin/python2.7 /usr/bin/pythonRoot
  pi@raspberrypi /var/www $ sudo chmod u+s /usr/bin/pythonRoot
  pi@raspberrypi /var/www $ ls -l /usr/bin/pythonRoot
  -rwsr-xr-x 1 root root 2674528 Mar 17 18:16 /usr/bin/pythonRoot
最後一步是配置我們的Web服務器,它的FastCGI模塊,並告訴它在哪裡可以找到我們的Python腳本。編輯/etc/lighttpd/lighttpd.conf這樣做:
添加一行到server.modules=()的列表頂部:
"mod_fastcgi"
將下列代碼添加到該文件底部:
fastcgi.server = (
   ".py" => (
     "python-fcgi" => (
       "socket" => "/tmp/fastcgi.python.socket",
       "bin-path" => "/var/www/doStuff.py",
       "check-local" => "disable",
       "max-procs" => 1)
    )
 )
需重新啟動Web服務器
sudo service lighttpd restart 那麼你現在應該能夠把你的LED開啟和關閉通過調用像這樣的網址:http://192.168.1.104/doStuff.py?q=w和http://192.168.1.104/doStuff.py?q=s(記得替換成你的IP地址)

參考資料:
http://davstott.me.uk/index.php/2013/03/17/raspberry-pi-controlling-gpio-from-the-web/

Wednesday, May 20, 2015

Rasberry GPIO 按鈕控制LED

上述三個程式主要是靠下列四個指令的功能:
GPIO.setmode  --> 指定Board Pin 和 BCM GPIO編號,例如程式中點亮LED的接腳實體上是接到板子的 pin 12,這指的是Board Pin ;對應到的BCM GPIO為 pin 18 。這是兩者差別,請參考下表。

GPIO.setup --> 這個部分就是指定Pin腳為輸入/輸出狀態。
GPIO.output -->當上述指定為輸出時狀態,這個指令用來定義高/低電位。
GPIO.input --> 當指定為輸入狀態時,這個指令用來監聽是否有輸入訊號。



import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(12,GPIO.OUT)#GPIO18
while True:
    input_state = GPIO.input(22)#GPIO25
    if input_state == False:
        print('Button Pressed')
        time.sleep(0.2)
        GPIO.output(12,GPIO.HIGH)
    else:
        GPIO.output(12,GPIO.LOW)

Monday, May 18, 2015

Raspberry GPIO 控制LED閃爍

Raspberry Pi支援輸入和輸出的控制,想學Raspberry Pi控制LED、步進馬達及繼電器等元件,就跟Arduino一樣,做一些自動控制的東西,於是動手收集Raspberry Pi控制輸入和輸出有關的資訊以及如何在Raspberry Pi安裝工具程式。
Raspberry Pi提供GPIO (General Purpose Input/Output)通用介面,可以透過程式做輸入或輸出的行為控制。Raspberry Pi的版子有2.54 mm 26-pin 的擴充頭,共有2排13個存取點,除了5V、3.3V及接地等pin外,還有其他17個可作為控制的pin腳,包括:

‧8個 GPIO pin
‧2個 UART pin
‧2個 I²C pin
‧5個 SPI pin


使用 Python 控制 GPIO

注意:
在 Raspbian 發行版當中,已經預先將 RPi.GPIO 模組包入,因此你可以直接寫以下的 python 程式來控制 GPIO4,要注意的是,RPi.GPIO 設定的 GPIO 是採用 Pin number,也就是說若我要修改 GPIO4 (Pin 7),則實際上呼叫 Rpi.GPIO 的號碼為 7 ,而不是 4 。

import RPi.GPIO as GPIO
import time

def blink(pin):
 GPIO.output(pin,GPIO.HIGH)
 time.sleep(0.5) 
 GPIO.output(pin,GPIO.LOW)
 time.sleep(0.5) 

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
for i in range(0,50):
 blink(7);
GPIO.cleanup()

安裝Raspberry

1.灌Raspberry
https://www.raspberrypi.org/downloads/
2.帳號:pi(預設)
3.startx
4.sudo apt-get update
   sudo apt-get upgrade
   sudo apt-get install vim

安裝好後:

在Windows下安裝(putty)
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html


在Host Name(or ip address)列:打raspberry pi IP

連線後來個簡單python程式

  1. vim
  2. i
  3. print("hello python");
  4. :w 檔名.py//儲存
  5. :q//跳出
  6. sudo python 檔名.py//執行