2013年8月31日 星期六

C語言當中的 extern 實例


在C語言當中,變數使用前要先宣告(declaration),而C 的 extern 關鍵字,用來表示此變數已經在別處定義(definition),然後告知Compiler要到別的地方找尋此變數的定義(可能在同一個檔案或其他檔案)。

但使用時要小心一點,在別的檔案定義變數只能夠定義一次,不然compiler會錯亂。

所以只要在程式裡面看到有使用 " extern " ,代表他是在別的程式有宣告到,而拿來用。

以下直接舉例子比較快,
這裡寫了三個程式,    a1.c 、 a2.c 、extern_test.c 。
分別如下:

2013年8月29日 星期四

find 、grep 、 xargs 搭配應用:



在Linux中,常常在Debug時要找字串,但是他可能又分在好多子目錄當中,而你也不知道到底在哪裡,這時候該怎辦??

------------------------------------------------------------------------------

假設我要在根目錄的所有子目錄下搜尋所有.c檔裡含有字串

” YinChenWang“ 的需求,下面有兩種方法:



1. $ sudo find / –name “*.c” -exec grep “YinChenWang” {} \;

2. $ sudo find / –name “*.c” | xargs grep “YinChenWamg”



說明:


  • 法1:
         他會根據 “/ “ 這個根目錄(包括所有子目錄)去尋找所有附檔名為.c

         的檔案,接著後面的 –exec 與 最後面的 \; 是一體的,裡面包的就是

         grep “YinChenWang” {} ,而{}裡面就是存放前面find所找到的所有.c檔,

         這樣大概懂意思了嗎? 也就是說-exec \; 這中間包的東西可以很多

         變化,例如你也可以使用rm或cp等等的搭配前面的find做不同應用,

         想看更詳細請參考

         鳥哥的Liunx 私房菜: http://linux.vbird.org/linux_basic/0220filemanager.php#find

  • 法2:
        其實效果與法1類似,其中用到了”xargs” ,他可以將前面find後的輸出結果,

        來當做你xargs後面所接的參數,以此例子來看,

        find後輸出的結果將會透過xargs來提供給grep “YinChenWang”使用。

        xargs的詳細說明請參考:

        xargs 應用介紹:   http://blog.yam.com/ddy1280/article/13941218

2013年8月28日 星期三

VIM常用指令

由於VIM網路上有相當多的資源,當然直接去鳥哥找是最快,但是這裡紀錄幾個我最常使用的功能,日後會持續的增加:


影像二值化小修正

1.原圖
做完邊緣偵測的情形之下,使用的是sobel演算法來做

做出來的第一個結果如下
2.毛邊很多
在有一些毛邊的形況之下,對程式碼做了一點小修正

把做完 Sobel 之後的每一 Pixel 的資料除以一個參數,以我自己為例,我取參數值為6

做出來如下圖,很明顯的比較漂亮一點了!!!
3.皮膚光滑?
接下來要做的是二值化(Thresholding)的動作,而threshold的值怎麼設定呢?

我們原本的一個pixel的值是0(黑)~255(白)

然而剛剛我們已經將每個參數都除以一個參數了

假設我們Threshold設成144(0~255時大概切一半,大於144的為黑色[0],小於144是白色[255])

其實就是將上面那一張圖黑變白白變黑拉XD

Threshold就應該要除以六(144/6=24),做出來的圖才是比較OK的

以下為Threshold=24
4.這張初步設定的threshold讓手臂被切掉惹
繼續調整Threshold=15試試看,一些線條又更明顯了
5.調整了一下比較OK了
如果在一開始邊緣偵測沒有將一些對我們來說是雜訊的毛邊削掉的話

也就是沒有除以一個參數做修正而直接做二值化

就會變成以下的圖,會比較不漂亮一點
6.這張......7月了別嚇人ㄏㄏ
這是最近的小心得和筆記~請各位不吝指教哈哈







2013年8月26日 星期一

Git學習

首先辦GitHub帳號:https://github.com/
參考建立Git詳細網站(有windows、Linux):http://note.tc.edu.tw/818.html

Demo Figure


Git基本指令:
     Git初始設定
     #Git config --global user.name “xx”
     #Git config --global user.email “bbjh5@hotmail.com

     #Git config --list 列出目前設定值

     建立一個新的Repository
     #Git init
     出現Initialized empty Git repository in /home/xxx/.git

     Clone(複製)別人的Repository
     Ex:git clone git://github.com/beckus/stm32_p103_demo.git

     改變最後一次的commit
     #Git commit --amend

     Stage的檔案給Unstage
     #Git reset HEAD file

     把修改過的檔案回到未修改狀態
     #Git check out -- file
     檢查狀態
     #Git status

     Git Branch
     建立一個新的Branch
     Ex: git branch experimental
     進入新的Brach
     #Git checkout experimental
     查詢有哪些Branch
     #Git branch
     切換Master branch
     #Git checkout master
     如有衝突,使用diff觀看並修改
     #git merge experimental
     Gitk 顯示resulting history圖表
     branch會做確認
     #git branch –d experimental
     branch(強制)
     #git branch –D experimental

     預設Branchmaster;預設Remoteorigin
     Ex: git pull origin = git fetch origin + git merge origin/master
     拉下來後的merge

     Git push origin master  :master pushorigin


25個線上練習Git的連結:http://try.github.io//levels/1/challenges/1


參考連結:
[1]寫給大家的Git教學(線上PPT)http://www.slideshare.net/littlebtc/git-5528339
[2]Git初學筆記-指令操作教學http://blog.longwin.com.tw/2009/05/git-learn-initial-command-2009/
[3]初次設定Githttp://git-scm.com/book/zh-tw/%E9%96%8B%E5%A7%8B-%E5%88%9D%E6%AC%A1%E8%A8%AD%E5%AE%9AGit
[4]Git的基本使用http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic/

彩色轉灰階原理(RGB To Grey)

彩色轉灰階原理(RGB To Grey) :

l   基礎
對於彩色轉灰度,有一個很著名的心理學公式:
Gray = R*0.299 + G*0.587 + B*0.114

l   整數算法

而實際應用時,希望避免低速的浮點運算,所以需要整數算法。
注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算算法:
Gray = (R*299 + G*587 + B*114 + 500) / 1000

RGB一般是8位精度,現在縮放1000倍,所以上面的運算是32位整型的運算。注意後面那個除法是整數除法,所以需要加上500來實現四捨五入。
就是由於該算法需要32位運算,所以該公式的另一個變種很流行:
Gray = (R*30 + G*59 + B*11 + 50) / 100

但是,雖說上一個公式是32位整數運算,但是根據80x86體系的整數乘除指令的特點,是可以用16位整數乘除指令來運算的。而且現在32位早普及了(AMD64都出來了),所以推薦使用上一個公式。

l   整數移位算法

上面的整數算法已經很快了,但是有一點仍制約速度,就是最後的那個除法。移位比除法快多了,所以可以將係數縮放成2的整數冪。
習慣上使用16位精度,216次冪是65536,所以這樣計算係數:
0.299 * 65536 = 19595.264 ≈ 19595
0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469
0.114 * 65536 + (0.896) = 7471.104 + 0.896 = 7472

可能很多人看見了,我所使用的捨入方式不是四捨五入。四捨五入會有較大的誤差,應該將以前的計算結果的誤差一起計算進去,舍入方式是去尾法:

  寫成表達式是:
Gray = (R*19595 + G*38469 + B*7472) >> 16

  220位精度的係數:
Gray = (R*1 + G*2 + B*1) >> 2
Gray = (R*2 + G*5 + B*1) >> 3
Gray = (R*4 + G*10 + B*2) >> 4
Gray = (R*9 + G*19 + B*4) >> 5
Gray = (R*19 + G*37 + B*8) >> 6
Gray = (R*38 + G*75 + B*15) >> 7
Gray = (R*76 + G*150 + B*30) >> 8
Gray = (R*153 + G*300 + B*59) >> 9
Gray = (R*306 + G*601 + B*117) >> 10
Gray = (R*612 + G*1202 + B*234) >> 11
Gray = (R*1224 + G*2405 + B*467) >> 12
Gray = (R*2449 + G*4809 + B*934) >> 13
Gray = (R*4898 + G*9618 + B*1868) >> 14
Gray = (R*9797 + G*19235 + B*3736) >> 15
Gray = (R*19595 + G*38469 + B*7472) >> 16
Gray = (R*39190 + G*76939 + B*14943) >> 17
Gray = (R*78381 + G*153878 + B*29885) >> 18
Gray = (R*156762 + G*307757 + B*59769) >> 19
Gray = (R*313524 + G*615514 + B*119538) >> 20

仔細觀察上面的表格,這些精度實際上是一樣的:3478101113141920
所以16位運算下最好的計算公式是使用7位精度,比先前那個係數縮放100倍的精度高,而且速度快:
Gray = (R*38 + G*75 + B*15) >> 7

其實最有意思的還是那個2位精度的,完全可以移位優化:
Gray = (R + (WORD)G<<1 + B) >> 2

由於誤差很大,所以做圖像處理絕不用該公式(最常用的是16位精度)。但對於遊戲編程,場景經常變化,用戶一般不可能觀察到顏色的細微差別,所以最常用的是2位精度。





2013年8月20日 星期二

GDB 入門筆記 - 近端偵錯(一)

<什麼是GDB?>

GDB 是一個Debug工具,只要是使用GNU之編譯器之程式都可以利用它來debug

使用的是文字介面,目前也開始發展圖形界面

<GDB有什麼特色?>

1.可以針對程式的執行做追蹤,同時也能在追蹤時對程式內之變數做修改


2.GDB不只能對在電腦上之程式做偵錯,也可以對嵌入式系統作遠端偵錯(Remote)

                              File:Cc25-GDB-Remote-Debugging.png


<GDB學習筆記>

近端偵錯:

1.安裝gdb

  • 先確定電腦上是否已經有安裝gdb:$whereis gdb
  • 如果沒有安裝:$sudo apt-get install gdb
2.開始使用gdb
  • 因此先寫一之測試程式testGDB.c
  • 使用gcc將它作編譯  $gcc -g -o testGDB.c testGDB
  • 對編譯好的執行檔做debug  $gdb ./testGDB

3.gdb常用指令

  • 輸入run (或是簡寫r) 可以在gdb上執行該支程式


  • 如果要在程式裡面加入中斷點,輸入break(或簡寫b)例如要進入main之前就讓程式停下來
    • (gdb)b main






  • 或是指定某一行停下來,例如在第五行停下來
    • (gdb)b 5
  • 設定完中斷點輸入run(或簡寫r)可開始執行,執行到中斷點停止。
    • (gdb)r
  • 如果要繼續執行下一行可輸入next(或簡寫n)
    • (gdb)n
  • 輸入info b 可查詢現在有的中斷點
    • (gdb)info b
  • 輸入c則執行到下一個中斷點為止
    • (gdb)c
  • 另外,如果要看執行到的當前那一行時,某個變數值可利用p的指令
    • (gdb)p num

<GDB基本指令>
command
about
run [args]
開始執行
start [args]
開始執行(並自動在main() break)
list [LINENUM]
    [FUNCTION]
    [FILE:LINENUM]
列出程式碼(重複list指令可接著列出下面十行)
print [EXP]
顯示expression的值
break[LINENUM]
     [FUCTION]
設一個break point
next [TIMES]
執行到下一個statement(不會進入function)
step [TIMES]
執行到下一個statement(會進入function)
until [LINENUM]
執行到某行
continue[TIMES]
執行到被中斷為止
finish
執行到結束此function(還可用return直接回傳並結束)
info [SUBCOMMAND]
顯示一些資訊(ex:breakpoints: info break)
help [SUBCOMMAND]
說明(ex: help list)



入門教學影片:



reference:
1.http://opencsl.openfoundry.org/Lab05_debugger.rst.html
2.http://blog.yslin.tw/2012/08/gdb.html


2013年8月19日 星期一

[Linux] Grep 指令介紹

grep (global search regular expression(RE) and print out the line)

我們經常在debug時,很常需要用到這個指令,他是用來做字串比對用
可以列出你所限定的關鍵字,無論是一行或是多行,非常好用   一定要學會!!

Usage : grep  [option ]  filename
(以下列出常用的,更多資訊可在Linux終端機輸入 grep --help 查詢)
option
-a : binary 檔案用 text 檔案的方式搜尋資料
-c : 可計算找到目標的次數(count)
-i : 忽略大小寫搜尋
-n : 輸出行號,在每行的前面加上行號
-V :顯示出來grep的版本跟相關的資訊

Example 1 :
# lsusb | grep ‘Linux’

Example 2:
#dmesg | grep  ‘RPC’

Example 3:
# grep -i  'printf'  capture_camera_and_image_process.c


結語: grep日後無論是debug或者是文件管理一定是常常用到的,學起來好用!!


        Refer to :