打開eclispe之後,看到的樣子大概是這樣吧
整體是工作臺,而view是各種子視窗的統稱,每個view有其特殊功能,如果不小心把某個view關閉了,可以從[windows]=>[show views]=>...找回來
2012年11月4日 星期日
最近.....
其實自己最近看了一堆,寫得很少,也已經不侷限在資訊的東西了,又加上迷上evernote,幾乎所有的東西都往那邊寫了,可能會整理出來的機會就更渺茫了XD畢竟維持兩邊的同步有些困難性在
再者,有些即使是資訊的東西,也不單純屬於linux,比方說最近在翻看eclipse,或許會整理一些有關eclipse的資料。其實對很多人來說,這個已經是個很一般的工具,我也用過一陣子,大多我都在使用netbeans,對eclipse的興致來至於他廣泛的支援性,比方說php之類,也因為是java的關係,跨平台也有不錯的特性,所以不管寫android app、java/jsp、php似乎也都可以用得上,我還真的沒有好好正面碰過他
[2012/11/08]
最近eclipse的更新到了一個地步,短時間內應該不會再碰了,畢竟只是短暫的接觸,主要也是寫下一些我認為比較值得紀錄的地方,真的不適合剛剛接觸程式語言的新手,適合對程式語言與一些IDE有經驗的人
再者,有些即使是資訊的東西,也不單純屬於linux,比方說最近在翻看eclipse,或許會整理一些有關eclipse的資料。其實對很多人來說,這個已經是個很一般的工具,我也用過一陣子,大多我都在使用netbeans,對eclipse的興致來至於他廣泛的支援性,比方說php之類,也因為是java的關係,跨平台也有不錯的特性,所以不管寫android app、java/jsp、php似乎也都可以用得上,我還真的沒有好好正面碰過他
[2012/11/08]
最近eclipse的更新到了一個地步,短時間內應該不會再碰了,畢竟只是短暫的接觸,主要也是寫下一些我認為比較值得紀錄的地方,真的不適合剛剛接觸程式語言的新手,適合對程式語言與一些IDE有經驗的人
2012年10月7日 星期日
Syntax Highter for Blogger
為了塞入一些code也要有syntax highlight功能,就在網路上尋尋覓覓囉,當然很多人的blogger都有的功能,想來這是一件明顯辦得到的事情,只是找到sytaxhighlighter這個的時候,很疑惑大家都把檔案(*.js/*.css)弄到哪裡去呢?blogger是不允許上傳.js跟.css的,不會是要整個code展開到範本內吧!?後來看到人家搭配使用google協作平台,就可以把需要的檔案上傳上去,不然真的要另外找空間了
底下是簡單cpp的成果
參考資料
底下是簡單cpp的成果
/**
* SyntaxHighlighter
*/
int foo(int counter)
{
if (counter <= 10)
return;
// it works!
}
參考資料
2012年8月12日 星期日
2012年8月6日 星期一
2012年7月18日 星期三
Android之JNI
就如我第一篇android說的,我不是很關心android如何應用這樣的機制去寫作應用程式,但是本身卻對機制的原理相當感興趣,如果想要學會如何使用NDK做JNI可以參考參考資料,步驟大概如這張圖
針對JNI在Android上大概分成三層Java/App<=>JNI Lyaer<=>Native
因為有些動作只能在Native完成,所以不得不使用C語言,但是使用者介面又是以Java構成,要使兩者可以溝通就是透過JNI的機制
首先看Java code,必須使用System.loadLibrary載入相對應的share object(.so),對於native function則使用native關鍵字標示出來
在java內已經宣告了java這邊的介面,用native表明到時候要透過JNI去呼叫Native程式,這時候用javah來編譯出C++ header file,使用JDK工具以特定格式去產生Native function的介面,這樣JNI才會認得兩邊的接口/介面,JNI這位中間人,就是依賴這樣的規則才能為兩邊牽線,下面是javah產生出來的.h檔案
跟著就是自行產生.cpp檔案,實作.h的介面
當呼叫System.loadLibrary的時候JNI會呼叫JNI_OnLoad函數,並且剖析share object(JNIEXPORT關鍵字做的手腳,export某些symbol),並且動態的將這些method註冊到JNI中,java code呼叫某個native method的時候其實是去尋找JNI中註冊表的method,來做呼叫
由於兩種程式語言的基本type並不相同,在兩者之間傳遞資料變成一件很重要的事情,所以如何對應呢?
<type>=>j<type>,如boolean(java)=>jboolean(c++),支援的type有boolean、byte、char、short、int、long、float、double
那麼如何在Native裡面呼叫java的某個物件的某個方法呢?其實如果熟悉Java Reflection這問題會容易解的多。
JNIEnv包含了JNI_OnLoad的時候做的資訊以及JVM的資訊,透過JNIEnv可以找到對應的class,再透過對應的class找出method與field,建構適當的signature就可執行某個object的method,跟Reflection的工作是大同小異的。
另外有個地方要注意的是,預設的狀況在Native並不會增加reference count,也就是說如果再Native functionm用static variable參考到某個object,並不表示下次來,這個object還會存在。可以使用env->NewGlobalRef(some_java_object)來取得global reference,但是要注意,這個global reference會使得garbage collect無法回收該物件,需要使用env->DeleteGlobalRef(some_java_object)來歸還
Native的exception是由JNI回報的,但是C++的異常蠻明顯不大相容於java,且處理很容易讓程式當掉,這時候JNIEnv可能用ExceptionOccured、ExceptionClear、ThrowNew報告異常
參考文件:
http://cheng-min-i-taiwan.blogspot.tw/2011/05/java-native-interface-jni-androidndk.html
http://blog.csdn.net/nicholas6lee/article/details/7324087
http://gyht0808.iteye.com/blog/763435
http://my.unix-center.net/~Simon_fu/?p=833
針對JNI在Android上大概分成三層Java/App<=>JNI Lyaer<=>Native
因為有些動作只能在Native完成,所以不得不使用C語言,但是使用者介面又是以Java構成,要使兩者可以溝通就是透過JNI的機制
首先看Java code,必須使用System.loadLibrary載入相對應的share object(.so),對於native function則使用native關鍵字標示出來
在java內已經宣告了java這邊的介面,用native表明到時候要透過JNI去呼叫Native程式,這時候用javah來編譯出C++ header file,使用JDK工具以特定格式去產生Native function的介面,這樣JNI才會認得兩邊的接口/介面,JNI這位中間人,就是依賴這樣的規則才能為兩邊牽線,下面是javah產生出來的.h檔案
跟著就是自行產生.cpp檔案,實作.h的介面
當呼叫System.loadLibrary的時候JNI會呼叫JNI_OnLoad函數,並且剖析share object(JNIEXPORT關鍵字做的手腳,export某些symbol),並且動態的將這些method註冊到JNI中,java code呼叫某個native method的時候其實是去尋找JNI中註冊表的method,來做呼叫
由於兩種程式語言的基本type並不相同,在兩者之間傳遞資料變成一件很重要的事情,所以如何對應呢?
<type>=>j<type>,如boolean(java)=>jboolean(c++),支援的type有boolean、byte、char、short、int、long、float、double
那麼如何在Native裡面呼叫java的某個物件的某個方法呢?其實如果熟悉Java Reflection這問題會容易解的多。
JNIEnv包含了JNI_OnLoad的時候做的資訊以及JVM的資訊,透過JNIEnv可以找到對應的class,再透過對應的class找出method與field,建構適當的signature就可執行某個object的method,跟Reflection的工作是大同小異的。
另外有個地方要注意的是,預設的狀況在Native並不會增加reference count,也就是說如果再Native functionm用static variable參考到某個object,並不表示下次來,這個object還會存在。可以使用env->NewGlobalRef(some_java_object)來取得global reference,但是要注意,這個global reference會使得garbage collect無法回收該物件,需要使用env->DeleteGlobalRef(some_java_object)來歸還
Native的exception是由JNI回報的,但是C++的異常蠻明顯不大相容於java,且處理很容易讓程式當掉,這時候JNIEnv可能用ExceptionOccured、ExceptionClear、ThrowNew報告異常
參考文件:
http://cheng-min-i-taiwan.blogspot.tw/2011/05/java-native-interface-jni-androidndk.html
http://blog.csdn.net/nicholas6lee/article/details/7324087
http://gyht0808.iteye.com/blog/763435
http://my.unix-center.net/~Simon_fu/?p=833
Learning OpenCV -- chapter 5
這一章談的是圖形的處理
blurring(平滑):用以去除雜訊或者讓影像模糊,基本原理是平均mask/filter內的pixel values
void cvSmooth(const CvArr* scr, CvArr* dst, int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, int param3=0, int param4=0);
平滑的type有: CV_BLUR(簡單模糊)、CV_BLUR_NO_SCALE(簡單無縮放模糊)、CV_MEDIAN(中值法)、CV_GUASSIAN(高斯模糊)、CV_BILATERAL(雙邊濾波)
其中簡單與高斯支援in-place,也就是destination或取代source
對於高斯而前param1與param2分別是mask/filter的width與height,第三個參數為sigma,如果要讓xy方向不同的sigma可以使用第四個參數
形態學(Morphology)
Erode(膨脹)與Dilate(侵蝕)是兩個常見的手法,用以將影像的一個部分與kernel(核)做convolution運算,每個kernel有個anchor point(通常位於中心)。膨脹求取局部最大值,使圖形中明亮的區域擴大,侵蝕則是求取區域最小值,侵蝕可以將一些斑點的noise去除
void cvErode(IplImage *src, IplImage *des, IplConvKernel *B=NULL, int iteration=1);
void cvDilate(IplImage *src, IplImage *des, IplConvKernel *B=NULL, int iteration=1);
這兩個運算都支援in-place,若是kernel不指定,則使用3x3的kernel,iteration則表示執行的次數
建立kernel的方式為
IplConvKernel * cvCreateStructuringElementEx(int cols, inr rows, int anchor_x,int anchor_y, int shape, int* values)
望文生義,前面四個參數就不解說了,第五個參數表示形狀有CV_SHAPE_RECT、CV_SHAPE_CROSS、CV_SHAPE_ELLIPSE、CV_SHAPE_CUSTOM
第五個參數表示特定的形狀
在Morphology往往反覆使用上面兩個運算,達到一些特殊目的
void cvMorphologyEx(
const CvArr* src,
CvArr* dst,
CvArr* temp,
IplConvKernel* element,
int operation,
int iterations = 1
);
OpenCV預設支援幾種常見的operator(CV_MOP_OPEN、CV_MOP_CLOSE、CV_MOP_GRADIENT、CV_MOP_TOPHAT、CV_MOP_BLACKHAT)
Open先Dilate再Erode,去除小型的高亮度區域
Close先Erode再Dilate,去除低亮度區域的孤立點
Gradient=dilate(src)-erode(src),邊界
TopHat=src-open(src)
BlackHat=close(src)-src
Flood Fill,就如小畫家的油漆桶一般
void cvFloodFill(
IplImage* img,
CvPoint seedPoint,
CvScalar newVal,
CvScalar loDiff = cvScalarAll(0),
CvScalar upDiff = cvScalarAll(0),
CvConnectedComp* comp = NULL,
int flags = 4,
CvArr* mask = NULL
);
調整大小
void cvResize(
const CvArr* src,
CvArr* dst,
int interpolation = CV_INTER_LINEAR
);
其中調整的時候是如何處理過多或者刪減的pixels,由最後一個參數指定,有CV_INTER_NN (Nearest neighbor)、CV_INTER_LINEAR(Bilinear)、CV_INTER_AREA(Pixel area re-sampling)、CV_INTER_CUBIC(Bicubic interpolation)
Image Pyramids看不懂,orz
取Threshold,運算有
double cvThreshold(
CvArr* src,
CvArr* dst,
double threshold,
double max_value,
int threshold_type
);
相對應的type為CV_THRESH_BINARY、CV_THRESH_BINARY_INV、CV_THRESH_TRUNC
CV_THRESH_TOZERO_INV、CV_THRESH_TOZERO
取threshold是一種技巧,友人發展出自動化的技巧,透過加權平均的方式自行取得threshold
void cvAdaptiveThreshold(
CvArr* src,
CvArr* dst,
double max_val,
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C
int threshold_type = CV_THRESH_BINARY,
int block_size = 3,
double param1 = 5
);
這個function並不支援in-place
以上的函數都是OpenCV已經幫忙實作完畢,只要直接套用就可以,相當方便,但是重點應該是何時該使用何種運算,以及運算背後代表的意義,才是我們要學習的重點(還是直接去翻閱Digital Image Processing的書XD)
blurring(平滑):用以去除雜訊或者讓影像模糊,基本原理是平均mask/filter內的pixel values
void cvSmooth(const CvArr* scr, CvArr* dst, int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, int param3=0, int param4=0);
平滑的type有: CV_BLUR(簡單模糊)、CV_BLUR_NO_SCALE(簡單無縮放模糊)、CV_MEDIAN(中值法)、CV_GUASSIAN(高斯模糊)、CV_BILATERAL(雙邊濾波)
其中簡單與高斯支援in-place,也就是destination或取代source
對於高斯而前param1與param2分別是mask/filter的width與height,第三個參數為sigma,如果要讓xy方向不同的sigma可以使用第四個參數
形態學(Morphology)
Erode(膨脹)與Dilate(侵蝕)是兩個常見的手法,用以將影像的一個部分與kernel(核)做convolution運算,每個kernel有個anchor point(通常位於中心)。膨脹求取局部最大值,使圖形中明亮的區域擴大,侵蝕則是求取區域最小值,侵蝕可以將一些斑點的noise去除
void cvErode(IplImage *src, IplImage *des, IplConvKernel *B=NULL, int iteration=1);
void cvDilate(IplImage *src, IplImage *des, IplConvKernel *B=NULL, int iteration=1);
這兩個運算都支援in-place,若是kernel不指定,則使用3x3的kernel,iteration則表示執行的次數
建立kernel的方式為
IplConvKernel * cvCreateStructuringElementEx(int cols, inr rows, int anchor_x,int anchor_y, int shape, int* values)
望文生義,前面四個參數就不解說了,第五個參數表示形狀有CV_SHAPE_RECT、CV_SHAPE_CROSS、CV_SHAPE_ELLIPSE、CV_SHAPE_CUSTOM
第五個參數表示特定的形狀
在Morphology往往反覆使用上面兩個運算,達到一些特殊目的
void cvMorphologyEx(
const CvArr* src,
CvArr* dst,
CvArr* temp,
IplConvKernel* element,
int operation,
int iterations = 1
);
OpenCV預設支援幾種常見的operator(CV_MOP_OPEN、CV_MOP_CLOSE、CV_MOP_GRADIENT、CV_MOP_TOPHAT、CV_MOP_BLACKHAT)
Open先Dilate再Erode,去除小型的高亮度區域
Close先Erode再Dilate,去除低亮度區域的孤立點
Gradient=dilate(src)-erode(src),邊界
TopHat=src-open(src)
BlackHat=close(src)-src
Flood Fill,就如小畫家的油漆桶一般
void cvFloodFill(
IplImage* img,
CvPoint seedPoint,
CvScalar newVal,
CvScalar loDiff = cvScalarAll(0),
CvScalar upDiff = cvScalarAll(0),
CvConnectedComp* comp = NULL,
int flags = 4,
CvArr* mask = NULL
);
調整大小
void cvResize(
const CvArr* src,
CvArr* dst,
int interpolation = CV_INTER_LINEAR
);
其中調整的時候是如何處理過多或者刪減的pixels,由最後一個參數指定,有CV_INTER_NN (Nearest neighbor)、CV_INTER_LINEAR(Bilinear)、CV_INTER_AREA(Pixel area re-sampling)、CV_INTER_CUBIC(Bicubic interpolation)
Image Pyramids看不懂,orz
取Threshold,運算有
double cvThreshold(
CvArr* src,
CvArr* dst,
double threshold,
double max_value,
int threshold_type
);
相對應的type為CV_THRESH_BINARY、CV_THRESH_BINARY_INV、CV_THRESH_TRUNC
CV_THRESH_TOZERO_INV、CV_THRESH_TOZERO
取threshold是一種技巧,友人發展出自動化的技巧,透過加權平均的方式自行取得threshold
void cvAdaptiveThreshold(
CvArr* src,
CvArr* dst,
double max_val,
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C
int threshold_type = CV_THRESH_BINARY,
int block_size = 3,
double param1 = 5
);
這個function並不支援in-place
以上的函數都是OpenCV已經幫忙實作完畢,只要直接套用就可以,相當方便,但是重點應該是何時該使用何種運算,以及運算背後代表的意義,才是我們要學習的重點(還是直接去翻閱Digital Image Processing的書XD)
訂閱:
文章 (Atom)







