2015年4月27日 星期一

Integrate OpenCV with QT

Windows8 + OpenCV v2.4.9 + QT v5.3.1 (Win+Android) + CMake v3.0.1 (win32/x86)
    Install QT, CMake, and OpenCV
    PATH=%PATH%;%QT%\Tools\mingw482_32\bin to make GCC accessible
    Launch CMake_GUI
    Set [Source code] to %CV%\sources
    Set [Build] to %CV%\mingw
    Click "Configure"
        Specify the generator for this project = MinGW Makefiles
        Specify native compilers = %QT%\Tools\mingw482_32\bin\gcc.exe and g++.exe
    You can see lots of items are colored in red.
    Alter configuration (optional),
        Check BUILD_EXAMPLES
        Check INSTALL_*
        Uncheck WITH_1394
        Check WITH_OPENGL
        Check WITH_QT
    Click "Configure" and some items are colored in red:
 %QT%/5.3/mingw482_32/lib/cmake/Qt5Concurrent
 %QT%/5.3/mingw482_32/lib/cmake/Qt5Core
   %QT%/5.3/mingw482_32/lib/cmake/Qt5Gui
   %QT%/5.3/mingw482_32/lib/cmake/Qt5Test
   %QT%/5.3/mingw482_32/lib/cmake/Qt5Widgets
   %QT%/5.3/mingw482_32/lib/cmake/Qt5OpenGL
    Click "Configure" and you see
    All items are colored in white rather than in red.
    Configuring done
    Click "Generate" to generate makefiles.
    Open a command prompt in \mingw.
    mingw32-make
    mingw32-make install

2015年4月23日 星期四

齊次座標 (homogeneous coordinate)

除了使用三維直角座標來表示物體的空間位置之外,在圖學中,也常使用「齊次座標」(homogeneous coordinate)來呈現,這一方面是為了方便將空間的平移、縮放、旋轉等轉換使用矩陣來記錄。

齊次座標使用四個元素來表示,即(x, y, z, w),要將齊次座標轉換為三維座標,其關係為(x/w, y/w, z/w),其中w表示座標軸的遠近參數,通常設為1,如果要用來表示遠近感,則會設定為距離的倒數(1/距離),例如表示一個無限遠的距離時,我們會將w 設定為0。

可以直接將之前介紹過的公式使用齊次座標與矩陣來展現,就可以瞭解齊次座標的好處處,例如以三維座標常見的平移、縮放與旋轉為例,表示方法如下(原座標x,y,z,轉換後x1,y1,z1):

平移:假設三個平移量分別為Tx、Ty與Tz。。。。


縮放:假設x、y、z的縮放比例分別為a、b、c。。 。。


旋轉:

CANBUS

If the PHY is not properly configured, TX in CAN MAC might not work continuously.
Ex1: 2nd MCP2515 TX is NG if TJA1040 STB is not 0.
Ex2: MCP2515 TX is NG if no other CAN node is connected.

2015年4月22日 星期三

Integrate OpenCV and Python

Install WinPython-64bit-2.7.9.4 which includes:
   Python 2.7.9   (OpenCV 2.4 supports Pythin 2.x while OpenCV 3.0 supports Python 3.x)
   NumPy 1.9.2
   SciPy 0.15.1

Copy \build\python\2.7\x64\cv2.pyd to \\Lib\site-packages

Verify (using IDEL)
   import cv2
   print (cv2.__version__)

高中英文:which/that/what關係代名詞


原文: http://bearwithprim.pixnet.net/blog/post/312118271-%E9%AB%98%E4%B8%AD%E8%8B%B1%E6%96%87%3Awhich-that-what%E9%97%9C%E4%BF%82%E4%BB%A3%E5%90%8D%E8%A9%9E

which 指人以外之生命,無生命者都可以用which
例句:
1. He likes the house which has many windows.
2. Where is the letter which I received yesterday?
3. I like the house which he lives in.

that 用法
  1. 先行詞是人或動物
  2. Who,which 開頭疑問句,為避免重複,用that
-Who is the man that has white hair?
-Which is the book that you borrowed from the library?
  1. It is…that 的強調用法
It is Columbus that discovered America in 1492.
  1. that前不可有介詞或逗點 (所以有介詞或逗點時要選who,which)
I will lend you the book, which is interesting.
I have two brothers, who live in Taipei.
想一想上面的規則,考考你:
-This is the house (in that/ in which) he lives. 選哪一個?
-I will lend you this book (, which/, that) is useful. 選哪一個?
正解:
   - in which   that前不可有介詞
-, which   that前不可有介詞或逗點
  1. that的瑣事: (這裡解釋了為什麼有時候必選that不可。)
-先行詞中有序數
Henry Ford was the first man that built cars.
-先行詞中有最高級
This is the most interesting book that I have ever read.
-先行詞中有the 家族 (the only 唯一;the very正式那個;the same同一個)
Man is the only animal that can speak.
This is the very book that I like very much.
-先行詞中有任何/全部/無一 (任何any/全部all/無一no)
Anyone that listens to him is a fool.
 what 用法
what = 先行詞+關係代名詞
what = the thing which
     = that which
     = all that

請把以下” 先行詞+關係代名詞” 改成what
因為使用what句子變簡短有力了。
 This is the thing which I need. = ? This is what I need.
Do you understand all that I said? = ? Do you understand what I said?
He saves all that he earned. = ? He saves what he earned.
The thing which he said is true. = ? What he said is true.

注意:
  1. 因為what本身已經有先行詞和關係代名詞的意義了,所以如果出現what,前面就不應該再出現先行詞,例如: that, the thing,…
  2. what 本身就可以當作主詞、受詞或補語,(which, that不同,which, that 只能當關係代名詞使用)

2015年4月20日 星期一

用MinGW編譯DLL

原文: http://october388.blogspot.tw/2009/04/mingwdll.html

testdll.h:
#ifndef TESTDLL_H
#define TESTDLL_H

#ifdef DLL_EXPORT
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

DLLAPI float funadd(float a, float b);

#ifdef __cplusplus
}
#endif

#endif


testmain.c:#include
#include "testdll.h"

int main(void)
{
float a,b,c;

    a=1.0;
    b=2.0;
    c=funadd(a,b);
    
    printf("%f \n",c);
    getchar();    
}


testdll.c:
#include "testdll.h"

float funadd(float a, float b)
{
    return (a+b);
}


gcc -c -DDLL_EXPORT (-fPIC) testdll.cPS : 會產生testdll.o的檔案...還有x86平台,-fPIC會忽略

gcc -shared -o testdll.dll testdll.o -Wl,--output-def,testdll.def,--out-implib,testdll.lib
PS : 產生三個檔案:
testdll.dll:也就是程式執行時載入的dll檔 
testdll.def:若有需要和VC編譯器連結,這個檔會需要
testdll.lib:export library,用來連結主程式,這樣主程式才能知道找哪個dll,那個dll裡有哪些函式跟參數....

gcc -c testmain.cPS : 用來使用dll的主程式,會產生一個testmain.o的檔案

gcc -static -o test.exe testmain.o -L. -ltestdllPS : 會讓主程式和export library(testdll.lib)靜態連結起來,產生test.exe的可執行檔


由於dll和主程式都是用MinGW產生的,所以可以簡化上面的步驟,不過上面的解說,可以對執行檔組成了解多一些,以下舉兩個例子

方法一:
gcc -shared -o testdll.dll testdll.c
PS : -shared是linker的參數,這裡直接產生testdll.dll

gcc -c testmain.c

PS : -c:只編譯不連結,產生testmain.o

gcc -o test.exe testmain.o testdll.dll

PS : 我也不知給什麼規則,反正MinGW搞得定這個testdll.dll就對了

方法二:
gcc -shared -o testdll.dll testdll.c
gcc -o test.exe testmain.c -L. -ltestdll

PS : -l:unix環境裡,會找libtestdll.a(-static) 或 libtestdll.so(-shared),在函式庫名稱的命名上,前面一定要有lib

不過MinGW對於這個慣例,放寬許多,來讓熟悉windows的人習慣
for (-static) : 會找libtestdll.a 或 testdll.lib
for (-shared) : 會找libtestdll.so . testdll.dll 或 libtestdll.dll

希望看完之後是感覺"條條道路通羅馬",而不是給它一整個亂...

這裡又牽扯出另一個疑問,那就是MinGW的make,它對於字尾規則和函式庫的處理,是否有加上這些擴充,有空在研究好了

PS:MinGW的官方網站,有提供一個Shell,叫MSYS,之前發現MinGW和MSYS都有自己的make,MinGW的make叫mingw32-make.exe,MSYS的make叫make.exe,其中MSYS的make是unix style,不能分辨'\',組成的路徑字串(windows是用'\',組成路徑字串),也許這兩個make除了這個區別,還包括了字尾規則和函式庫處理的差異...


testdll.h的補充說明:
關於DLL_EXPORT 的定義,應該要在編譯testdll.c時定義,來分別dllimport和dllexport,不過我沒加,也沒錯誤,我不知道MinGW有沒有支援__declspec(dllimport)和__declspec(dllexport) 這些關鍵字...

關於extern "C" {},如果使用gcc,且souce code的附檔名是.c,會有錯誤,不過__cplusplus沒有定義,會避開...
如果附檔名是.cpp,或gcc改g++,則__cplusplus會定義,就會使函數的Name Mangling使用C的形式(簡單的那一種),常看到...

這裡的紀錄,主要都是看了別人的文章,試出來的...我盡量有系統性,不過最好還是參考相關主要說明文件

Creating a shared and static library with the gnu compiler [gcc]

Source: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html


Creating a shared and static library with the gnu compiler [gcc]

Here's a summary on how to create a shared and a static library with gcc. The goal is to show the basic steps. I do not want to go into the hairy details. It should be possible to use this page as a reference.
These examples were tested and run on cygwin/Windows.

The code for the library

This is the code that goes into the library. It exhibits one single function that takes two doubles and calculates their mean value and returns it.
calc_mean.c
//#include 

double mean(double a, double b) {
  return (a+b) / 2;
}

The header file

Of course, we need a header file.
calc_mean.h
double mean(double, double);

Creating the static library

A static library is basically a set of object files that were copied into a single file. This single file is the static library. The static file is created with the archiver (ar).
First, calc_mean.c is turned into an object file:
gcc -c calc_mean.c -o calc_mean.o
Then, the archiver (ar) is invoked to produce a static library (named libmean.a) out of the object file calc_mean.o.
ar  rcs libmean.a      calc_mean.o
Note: the library must start with the three letters lib and have the suffix .a.

Creating the shared library

As with static libraries, an object file is created. The -fPIC option tells gcc to create position independant code which is necessary for shared libraries. Note also, that the object file created for the static library will be overwritten. That's not bad, however, because we have a static library that already contains the needed object file.
gcc -c -fPIC calc_mean.c -o calc_mean.o    
For some reason, gcc says:
cc1: warning: -fPIC ignored for target (all code is position independent)
It looks like -fPIC is not necessary on x86, but all manuals say, it's needed, so I use it too.
Now, the shared library is created
gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1  calc_mean.o
Note: the library must start with the three letter lib.

The programm using the library

This is the program that uses the calc_mean library. Once, we will link it against the static library and once against the shared library.
main.c
#include 
#include "calc_mean.h"

int main(int argc, char* argv[]) {

  double v1, v2, m;
  v1 = 5.2;
  v2 = 7.9;

  m  = mean(v1, v2);

  printf("The mean of %3.2f and %3.2f is %3.2f\n", v1, v2, m);

  return 0;
}

Linking against static library

gcc -static main.c -L. -lmean -o statically_linked
Note: the first three letters (the lib) must not be specified, as well as the suffix (.a)

Linking against shared library

gcc main.c -o dynamically_linked -L. -lmean
Note: the first three letters (the lib) must not be specified, as well as the suffix (.so)

Executing the dynamically linked programm

LD_LIBRARY_PATH=.
./dynamically_linked

Thanks

Thanks to Donn Morrison who helped me improve this page.

2015年4月10日 星期五

Android開發人員選項

開啟: 設定 > 關於 > 軟體資訊 > (點七次)版本號碼
關閉: 設定 > 應用程式 > 設定 > 清除資料

2015年4月7日 星期二

Kconfig

來源: http://www.wretch.cc/blog/welkinchen/9859140
Kconfig 文件的用途 (Make 選單的建立)

Kconfig文件的用途

配置選項是以樹的形式組織的,每個選項都有其自己的依賴關係。
這些依賴關係決定了選項是否是可見的。父選項可見,子選項才能可見。

核心原始碼的目錄下都有兩個文件 Kconfig(2.4版本是Config.in)和 Makefile。
分佈到各目錄的Kconfig構成了一個分散式的核心配置資料庫,
每個 Kconfig分別描述了與所屬目錄文件相關的核心配置功能表。
在核心配置 make menuconfig(或 xconfig 等)時,
從 Kconfig 中讀出功能表,用戶選擇後保存到 .config的核心配置文件中。
在核心編譯時,主Makefile 調用這個 .config,就知道了用戶的選擇。

*上面的內容說明了, Kconfig 就是對應著核心的配置功能表。
假如想添加新的驅動到核心的原始碼中,修改 Kconfig,這樣就能夠選擇這個驅動,
假如想編譯這個驅動,要修改 Makefile,所以添加新的驅動時需要修改的文件有兩種(注意不只是兩個)
Kconfig
Makefile

要想知道怎麼修改這兩種文件,就要知道兩種文件的語法結構

Kconfig
每個功能表都有一個關鍵字標識,最常見的就是config

config MODVERSIONS
    bool "Set version information on all module symbols"
    depends MODULES
    help
      Usually, modules have to be recompiled whenever you switch to a new
      kernel.  ...

每行都是以關鍵字開始,並可以接多個參數。
"config" 為定義了一新的配置選項。
而緊接著的下面幾行定義了該配置選項的屬性。
屬性可以是該配置選項的類型,輸入提示(input prompt),依賴關係,幫助資訊和預設值。
配置選項可以用相同的名字定義多次,但每個定義只能有一個輸入提示並且類型不能衝突。

語法:
config
symbol是個新的標記的功能表項,options是在這個新的功能表項下的屬性和選項
其中options部分有:

- 類型定義:"bool"/"tristate"/"string"/"hex"/"int"
  每個config功能表項都要有類型定義,每個配置選項都必須指定類型。
  有兩個基本類型:tristate 和 string,其他類型都是基於這兩個基本類型。
 
  bool布林類型、
  tristate三態:內建、模組、移除、
  string字串、
  hex十六進位、
  integer整型
 
  例如config HELLO_MODULE
  bool "hello test module"
  bool 類型的只能選或不選,tristate 類型的選項多了編譯成核心模組的選項,
       假如選擇編譯成核心模組,則會在 .config 中生成一個 CONFIG_HELLO_MODULE=m 的配置,
       假如選擇內建,就是直接編譯進核心,就會在 .config 中生成一個 CONFIG_HELLO_MODULE=y 的配置.

  類型定義可以用輸入提示,所以下面的兩個例子是等價的:
     bool "Networking support"
  and
     bool
          prompt "Networking support"

- 依賴型定義 depends on或 requires
  指此功能表的出現與否是依賴另一個定義
  config HELLO_MODULE
         bool "hello test module"
         depends on ARCH_PXA

  這個例子表明HELLO_MODULE這個功能表項只對XScale處理器有效。

- 幫助資訊: "help" or "---help---"
  定義一幫助資訊。幫助資訊的結束就由縮進的水準決定的,
  這也就意味著資訊是在第一個比幫助資訊開始行的縮進小的行結束。
  "---help---" 和 "help" 在實現的作用上沒有區別,
  "---help---" 有助於將檔中的配置邏輯與給開發人員的提示分開。

- 輸入提示: "prompt" ["if" ]
  每個功能表選項最多只能有一個顯示給用戶的輸入提示。
  可以用 "if" 來表示該提示的依賴關係,當然這是可選的。

- 預設值:"default" ["if" ]
  一個配置選項可以有任意多個預設值。
  如果有多個預設值,那麼只有第一個被定義的值是可用的。
  預設值並不是只限于應用在定義他們的功能表選項。
  這就意味著預設值可以定義在任何地方或被更早的定義覆蓋。
  如果用戶沒有設置(通過上面的輸入提示),配置選項的值就是預設值。
  如果可以顯示輸入提示的話,就會把預設值顯示給用戶,並可以讓用戶進行修改。
  預設值的依賴關係可以用 "if" 添加。(可選項)

- 依賴關係:"depends on"/"requires"
  為一功能表選項定義依賴關係。
  如果定義了多個依賴關係,它們之間用 '&&' 間隔。
  依賴關係也可以應用到該功能表中所有的其他選項(同樣接受一if運算式),
  所以下面的兩個例子是等價的:

    bool "foo" if BAR
         default y if BAR
  and
    depends on BAR
    bool "foo"
         default y

- 反向依賴關係:"select" ["if" ]
  儘管普通的依賴關係可以降低一選項的上限,反向依賴能將這一限制降的更低。
  當前功能表選項的值是symbol的最小值。
  如果symbol被選擇了多次,上限就是其中的最大值。
  反向依賴只能用在 boolean 或 tristate 選項上。

- 資料範圍:"range" ["if" ]
  為int和hex類型的選項設置可以接受輸入值範圍。
  用戶只能輸入大於等於第一個symbol,小於等於第二個symbol的值。


選單依賴關係
------------

依賴關係決定了功能表選項是否可見,也可以減少tristate的輸入範圍。
tristate邏輯比boolean邏輯在表達式中用更多的狀態(state)來表示模組的狀態。
依賴關係運算式的語法如下:

::=                              (1)
           '='                 (2)
           '!='                (3)
           '(' ')'                       (4)
           '!'                            (5)
           '&&'                    (6)
           '||'                    (7)

運算式是以優先順序的降冪列出的。

(1) 將symbol賦給運算式。boolean和tristate類型的symbol直接賦給運算式。
    所有其他類型的symbol都賦 'n'。
(2) 如果兩個symbol相等,返回'y',否則為'n'。
(3) 如果兩個symbol相等,返回'n',否則為'y'。
(4) 返回運算式的值。用於改變優先順序。
(5) 返回 (2-/expr/) 的結果。
(6) 返回 min(/expr/,/expr/) 的結果。
(7) 返回 max(/expr/,/expr/) 的結果。

一個運算式的值可以是'n','m'或'y'(或者是計算的結果 0,1,2)。
當運算式的值為'm'或'y'的時候,選單選項才是可見的。

symbol有兩種類型:不可變的和可變的。不可變的symbol是最普通的,
由'config'語句定義,完全由數字、字母和下劃線組成(alphanumeric characters or underscores)。
不可變的symbol只是運算式的一部分。經常用單引號或雙引號括起來。
在引號中,可以使用任何字元,使用引號要用轉義字元'\'。

功能表結構
--------

功能表在樹中的位置可由兩種方法決定。第一種可以是這樣:

menu "Network device support"
    depends NET

config NETDEVICES
    ...

endmenu

所有的在"menu" ... "endmenu" 之間都是"Network device support"的子功能表。
所有的子功能表選項都繼承了父功能表的依賴關係,
比如,"NET"的依賴關係就被加到了配置選項NETDEVICES的依賴列表中。

還有就是通過分析依賴關係生成功能表的結構。
如果功能表選項在一定程度上依賴於前面的選項,它就能成為該選項的子功能表。
首先,前面的(父)選項必須是依賴列表中的一部分並且它們中必須有滿足下面兩個條件的選項:
- 如果父選項為'n',子選項必須不可見。
- 如果父選項可見,子選項才能可見。

config MODULES
    bool "Enable loadable module support"

config MODVERSIONS
    bool "Set version information on all module symbols"
    depends MODULES

comment "module support disabled"
    depends !MODULES

MODVERSIONS 直接依賴 MODULES,這就意味著如果MODULES不為'n',該選項才可見。
換句話說,當MODULES可見時,選項才可見(MODULES的(空)依賴關係也是選項依賴關係的一部分)。

Kconfig 語法
------------

配置檔描述了功能表選項,每行都是以一關鍵字開頭(除了幫助資訊)。
下面的關鍵字結束一功能表選項:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
前5個同樣可以用在功能表選項定義的開始。

config:

    "config"
   

定義了一配置選項 並且可以接受任何前面介紹的屬性。

menuconfig:
    "menuconfig"
   

此關鍵字和前面的關鍵字很相似,但它在前面的基礎上要求所有的子選項作為獨立的行顯示。
( This is similar to the simple config entry above,
  but it also gives a hint to front ends,
  that all suboptions should be displayed as a separate list of options.)

choices:

    "choice"
   
   
    "endchoice"

該關鍵字定義了一組選擇項,並且選項可以是前面描述的任何屬性。
儘管boolean只允許選擇一個配置選項,tristate可以於多個配置選項設為'm',
但選項只能是boolean或tristate類型。
這可以在一個硬體有多個驅動的情況下使用,最終只有一個驅動被編譯進/載入到核心,
但所有的驅動都可以編譯成模組。
選項可以接受的另一個選項是"optional",這樣選項就被設置為'n',沒有被選中的。

comment:

    "comment"
   

這裏定義了在配置過程中顯示給用戶的注釋,該注釋還將寫進輸出檔中。
唯一可用的可選項是依賴關係。

menu:

    "menu"
   
   
    "endmenu"

這裏定義了一個功能表,詳細資訊請看前面的"功能表結構"。
唯一可用的可選項是依賴關係。

if:

    "if"
   
    "endif"

這裏定義了if結構。依賴關係被加到所有在if ... endif 中的功能表選項中。
(lb:請看linux-source/drivers/ata/Kconfig:20)

 

Makefile
在 linux2.6.x/Documentation/kbuild 目錄下有詳細關於 kernel makefile 的介紹。
核心的Makefile分為5個組成部分:
Makefile  最頂層的Makefile
.config   核心的當前配置文件,編譯時成為定層Makefile的一部分
arch/$(ARCH)/Makefile 和體系結構相關的 Makefile
s/ Makefile.*   一些Makefile的通用規則
kbuild Makefile 各級目錄下的大約有500個文件,編譯時根據上層 Makefile 傳下來的
                巨集定義和其他編譯規則,將源代碼編譯成模組或編入核心

頂層的Makefile文件讀取 .config 文件的內容,並且在總體上負責建立核心和模組。
Arch Makefile 則提供補充系統結構相關的資訊。
s 目錄下的 Makefile 文件包含了任何根據 kbuild Makefile 構建核心所需的定義和規則。
(其中 .config 的內容是在 make menuconfig 的時候,通過 Kconfig 文件配置的結果。

舉個例子:
假設想把自己寫的一個flash的驅動程式載入到工程中,而且能夠通過 menuconfig 配置
核心時選擇該驅動該怎麼辦呢?能夠分三步:

第一:將您寫的 flashtest.c 文件添加到 /driver/mtd/maps/ 目錄下。
第二:修改 /driver/mtd/maps 目錄下的 kconfig 文件:
      config MTD_flashtest
      tristate “ap71 flash"
      這樣當 make menuconfig 時 ,將會出現 ap71 flash選項。
第三:修改該目錄下makefile文件。
      添加如下內容:obj-$(CONFIG_MTD_flashtest)+= flashtest.o

這樣,當您運行 make menucofnig 時,您將發現ap71 flash選項。
假如您選擇了此項,該選擇就會保存在 .config 文件中。
當您編譯核心時,將會讀取 .config 文件,當發現 ap71 flash 選項為 yes 時,
系統在呼叫 /driver/mtd/maps/ 下的 makefile 時,將會把 flashtest.o 加入到核心中。