SIFT算法的教程、原始碼及應用軟件
1、ubc:DAVID LOWE---SIFT算法的創始人,兩篇經典的文章
http://www.cs.ubc.ca/~lowe/
2、cmu:YanKe---PCASIFT,總結的SIFT方面的文章SO全,超經典
http://www.andrew.cmu.edu/user/yke/
3、ubc:MBROWN---SIFT算法用於圖像拼接的經典應用autopano-sift,包括一個SIFTLIB庫
http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html
http://www.cs.ubc.ca/~mbrown/panorama/panorama.html
4、toronto:Jepson---Matlab SIFT tutorial, 超級超級超級經典~
http://www.cs.toronto.edu/~jepson
5、ucla:Vedaldi---加州大學一個博士生編的SIFT,Matlab、C的都有,但沒用過
http://www.cs.ucla.edu/~vedaldi/
6、一個小的拼接軟體ptasmblr
http://www.tawbaware.com/ptasmblr.htm
轉自 http://summerstation.spaces.live.com/blog/cns!e39c001cb6e4b188!1501.entry
星期四, 3月 24, 2011
星期二, 12月 14, 2010
[MFC] CImage 直接存取記憶體
//for 8-bit 影像
byte* pRealData=(byte*)m_Image.GetBits(); //取得記憶體開頭
int pit=m_Image.GetPitch(); //每一行的記憶體寬度
for (int y=0; y< Height;y++){
for (int x=0; x< Width;x++){
pRealData[ pit*y + x] = Intensity;
}}
//for 24-bit 影像
byte* pRealData=(byte*)SaveImg.GetBits();
int pit=SaveImg.GetPitch();
int bitCount=3;
for (int y=0; y< height; y++) {
for (int x=0; x< width; x++) {
pRealData [ pit*y + x*bitCount] = R ;
pRealData [ pit*y + x*bitCount+1] = G ;
pRealData [ pit*y + x*bitCount+2] = B;
}}
byte* pRealData=(byte*)m_Image.GetBits(); //取得記憶體開頭
int pit=m_Image.GetPitch(); //每一行的記憶體寬度
for (int y=0; y< Height;y++){
for (int x=0; x< Width;x++){
pRealData[ pit*y + x] = Intensity;
}}
//for 24-bit 影像
byte* pRealData=(byte*)SaveImg.GetBits();
int pit=SaveImg.GetPitch();
int bitCount=3;
for (int y=0; y< height; y++) {
for (int x=0; x< width; x++) {
pRealData [ pit*y + x*bitCount] = R ;
pRealData [ pit*y + x*bitCount+1] = G ;
pRealData [ pit*y + x*bitCount+2] = B;
}}
星期一, 11月 29, 2010
[MFC] Multithread
//Thread function 內容
UINT MyThreadFun(LPVOID LParam)
{
MyThreadInfo *pInfo1=(MyThreadInfo*) LParam;
CTESTDlg *hWnd=(CTESTDlg*)CWnd::FromHandle(pInfo1->Wnd);
CSliderCtrl *slider=(CSliderCtrl*)hWnd->GetDlgItem(IDC_SLIDER1);
slider->SetLineSize(100); // 設定 slider 大小
for(int i=0;i<100;i++){
slider->SetPos(i); // 移動 slider
Sleep(100); // 暫停 thread
}
return(0);
}
//Dialog按鈕程式碼
//開始 Tread
struct MyThreadInfo{
HWND hWnd; // 紀錄產生 thread 的視窗物件
}Info1;
void CTESTDlg::OnBnClickedOk()
{
Info1.hWnd=this->m_hWnd; // 紀錄 Dialog 的window handle
AfxBeginThread(MyThreadFun, (LPVOID)&Info1);
}
UINT MyThreadFun(LPVOID LParam)
{
MyThreadInfo *pInfo1=(MyThreadInfo*) LParam;
CTESTDlg *hWnd=(CTESTDlg*)CWnd::FromHandle(pInfo1->Wnd);
CSliderCtrl *slider=(CSliderCtrl*)hWnd->GetDlgItem(IDC_SLIDER1);
slider->SetLineSize(100); // 設定 slider 大小
for(int i=0;i<100;i++){
slider->SetPos(i); // 移動 slider
Sleep(100); // 暫停 thread
}
return(0);
}
//如果希望 thread function 能放在 class 中, 請宣告它為 static
class CTESTDlg : public CDialog {
static UINT MyThreadFun(LPVOID LParam);
};
///////////////////////////////////////////////////////////////
//Dialog按鈕程式碼
//開始 Tread
struct MyThreadInfo{
HWND hWnd; // 紀錄產生 thread 的視窗物件
}Info1;
void CTESTDlg::OnBnClickedOk()
{
Info1.hWnd=this->m_hWnd; // 紀錄 Dialog 的window handle
AfxBeginThread(MyThreadFun, (LPVOID)&Info1);
}
星期二, 11月 16, 2010
[MFC] Unicode環境下使用CStdioFile來存取中文檔案
因為CStdioFile並不支援Unicode所以無法存取Uncode檔案,而當存取ANSI檔案時又因為Unicode環境下而造成無法使用CStdioFile::ReadString()所讀到的CString。所以加入下面一行程式碼來設定讀入的檔案的地區編碼。
Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
setlocale( LC_CTYPE,"cht" );如果是簡體中文則將cht改為chs。
其他參考文章:解决UNICODE字符集下CStdioFile的Writestring无法写入中文的问题
Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
[MFC] CImage的簡單複製方法 (Copy CImage)
BOOL ImageCopy(const CImage &srcImage, CImage &destImage)
{
int i,j;//循環變量
if(srcImage.IsNull())
return FALSE;
//原始影像參數
BYTE* srcPtr=(BYTE*)srcImage.GetBits();
int srcBitsCount=srcImage.GetBPP();
int srcWidth=srcImage.GetWidth();
int srcHeight=srcImage.GetHeight();
int srcPitch=srcImage.GetPitch();
//銷毀原有圖像
if( !destImage.IsNull())
{
destImage.Destroy();
}
//創建新圖像
if(srcBitsCount==32) //支援alpha通道
{
destImage.Create(srcWidth,srcHeight,srcBitsCount,1);
}
else
{
destImage.Create(srcWidth,srcHeight,srcBitsCount,0);
}
//加載調色板
if(srcBitsCount<=8&&srcImage.IsIndexed())//需要調色盤
{
RGBQUAD pal[256];
int nColors=srcImage.GetMaxColorTableEntries();
if(nColors>0)
{
srcImage.GetColorTable(0,nColors,pal);
destImage.SetColorTable(0,nColors,pal);//複製調色盤
}
}
//目標影像參數
BYTE *destPtr=(BYTE*)destImage.GetBits();
int destPitch=destImage.GetPitch();
//複製影像數據
for(i=0 ; i<srcHeight;i++)
{
memcpy( destPtr+i*destPitch, srcPtr+i*srcPitch, abs(srcPitch) );
}
return TRUE;
}
星期一, 10月 25, 2010
[攝影] 利用Photoshop做數位黑卡
前置作業:
1. 在Photoshop中同時開啟亮片與暗片。
2. 點選暗片後按Ctrl+A(全選),再按Ctrl+C(拷貝),之後就可以關閉暗片的檔案,你已經用不到暗片了。
3. 點選亮片後按Ctrl+V(貼上),前置作業完成。
繼續:
1. 在LAYER對話框(PALLETE)中先點選第一層也就是暗片的部分,然後點選對話盒最下方,由左邊數來第二個圖示(Add Vector Mask),這時在第一層會出現一個白色的矩形。
2. 在LAYER對話盒點選第二層也就是BACKGROUND的部分,按Ctrl+A(全選),再按Ctrl+C(拷貝)。
3. 按住ALT同時點選在第一步驟時出現的白色長方形,這時畫面會變成白色,再按Ctrl+V(貼上),你會看到黑白影像。
4. 到 Filter / Blur / Gaussian Blur ,把 Radius 設為 40 pixels。
5. 到LAYER對話盒點選BACKGROUND,你就可以看到合成完成的影像。
6. 到 Image/ Adjustment / Shadow/Highlight 將SHADOW值設為24,或其他你認為適當的數值。
7. 回到LAYER對話盒,按上方最右邊的箭頭,將會出現選單,選擇Flaten Image就大功告成了。
引用來源 中文 英文
1. 在Photoshop中同時開啟亮片與暗片。
2. 點選暗片後按Ctrl+A(全選),再按Ctrl+C(拷貝),之後就可以關閉暗片的檔案,你已經用不到暗片了。
3. 點選亮片後按Ctrl+V(貼上),前置作業完成。
繼續:
1. 在LAYER對話框(PALLETE)中先點選第一層也就是暗片的部分,然後點選對話盒最下方,由左邊數來第二個圖示(Add Vector Mask),這時在第一層會出現一個白色的矩形。
2. 在LAYER對話盒點選第二層也就是BACKGROUND的部分,按Ctrl+A(全選),再按Ctrl+C(拷貝)。
3. 按住ALT同時點選在第一步驟時出現的白色長方形,這時畫面會變成白色,再按Ctrl+V(貼上),你會看到黑白影像。
4. 到 Filter / Blur / Gaussian Blur ,把 Radius 設為 40 pixels。
5. 到LAYER對話盒點選BACKGROUND,你就可以看到合成完成的影像。
6. 到 Image/ Adjustment / Shadow/Highlight 將SHADOW值設為24,或其他你認為適當的數值。
7. 回到LAYER對話盒,按上方最右邊的箭頭,將會出現選單,選擇Flaten Image就大功告成了。
引用來源 中文 英文
星期六, 5月 22, 2010
星期四, 4月 01, 2010
[旅遊] 2010-04-01 平溪一日遊
星期日, 1月 04, 2009
[MFC] CSrollView的 ScrollBar
1 OnInitialUpdate()函式裡的sizeTotal.cx=sizeTotal.cy 值要設定
2. CSize sizeTotal(Getx(),Gety());
SetScrollSizes(MM_TEXT, sizeTotal);
2. CSize sizeTotal(Getx(),Gety());
SetScrollSizes(MM_TEXT, sizeTotal);
[VS2005] 怎樣添加事件、映射消息和重載函數
VS2005 的 MFC 添加事件、映射消息和重載函數的操作 和 VS6.0 不一樣,是在類別的屬性頁裡。操作如下:
在「類別檢視」中,右鍵單擊想要操作的類別,點擊「屬性」。在打開的屬性頁中,最上一排按鈕中的「事件」、「訊息」和「覆寫」分別對應「添加事件」、「映射消息」和「重載函數」的操作。
在「類別檢視」中,右鍵單擊想要操作的類別,點擊「屬性」。在打開的屬性頁中,最上一排按鈕中的「事件」、「訊息」和「覆寫」分別對應「添加事件」、「映射消息」和「重載函數」的操作。
星期六, 1月 03, 2009
[MFC] 全螢幕功能-開始工作列未消失
原因是OnGetMinMaxInfo這個函式沒有被OverRide,
,最好是用ClassWizard,不要用手動。因為很可能會沒有效果。
要重寫此函式的原因如下:
程序中有一個地方要說明一下,那就是OnGetMinMaxInfo函數的作用。你可以試一下,如果把這個函數去掉,則當你按下工具欄中的全屏顯示按鈕時,框架視圖確實變大了,但沒有想像的那樣實現全屏顯示,底邊留下一個狀態欄——一個有些發育不良的全屏顯示窗口。為什麼會這樣呢?經過調試後,發現問題出在WM_GETMINMAXINFO消息的處理上。在Windows中,無論什麼時候以何種方式改變窗口的尺寸或大小,是拖拽窗口邊緣也好,或是在代碼中調用改變窗口尺寸的函數也好,總之不管你用什麼方法,Windows都會首先發送WM_GETMINMAXINFO消息。這個消息的意思是說:「嘿,如果你要強迫我的尺寸變大或變小,就附上詳細的MINMAXINFO結構信息,否則我用默認值處理。」大多數應用程序都不用顯式處理這個 WM_GETMINMAXINFO消息(也就是說讓DefWindowProc窗口過程進行缺省處理),而Windows在進行缺省處理時是不會讓一個窗口視圖比屏幕還大的,所以我們會碰上前面講的那個問題。解決的方法是:不要讓Windows對WM_GETMINMAXINFO消息進行缺省處理,而是由我們自己處理,方法如下:
,最好是用ClassWizard,不要用手動。因為很可能會沒有效果。
要重寫此函式的原因如下:
程序中有一個地方要說明一下,那就是OnGetMinMaxInfo函數的作用。你可以試一下,如果把這個函數去掉,則當你按下工具欄中的全屏顯示按鈕時,框架視圖確實變大了,但沒有想像的那樣實現全屏顯示,底邊留下一個狀態欄——一個有些發育不良的全屏顯示窗口。為什麼會這樣呢?經過調試後,發現問題出在WM_GETMINMAXINFO消息的處理上。在Windows中,無論什麼時候以何種方式改變窗口的尺寸或大小,是拖拽窗口邊緣也好,或是在代碼中調用改變窗口尺寸的函數也好,總之不管你用什麼方法,Windows都會首先發送WM_GETMINMAXINFO消息。這個消息的意思是說:「嘿,如果你要強迫我的尺寸變大或變小,就附上詳細的MINMAXINFO結構信息,否則我用默認值處理。」大多數應用程序都不用顯式處理這個 WM_GETMINMAXINFO消息(也就是說讓DefWindowProc窗口過程進行缺省處理),而Windows在進行缺省處理時是不會讓一個窗口視圖比屏幕還大的,所以我們會碰上前面講的那個問題。解決的方法是:不要讓Windows對WM_GETMINMAXINFO消息進行缺省處理,而是由我們自己處理,方法如下:
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
if (m_bFullScreen)
{
lpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height();
lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y;
lpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width();
lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x;
}
//CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
星期四, 1月 01, 2009
JPEG 壓縮簡介
/************************************************************************
JPEG 壓縮簡介
-------------
1. 色彩模型
JPEG 的圖片使用的是 YCrCb 顏色模型, 而不是計算機上最常用的 RGB. 關於色
彩模型, 這裡不多闡述. 只是說明, YCrCb 模型更適合圖形壓縮. 因為人眼對圖片上
的亮度 Y 的變化遠比色度 C 的變化敏感. 我們完全可以每個點保存一個 8bit 的亮
度值, 每 2x2 個點保存一個 Cr Cb 值, 而圖像在肉眼中的感覺不會起太大的變化.
所以, 原來用 RGB 模型, 4 個點需要 4x3=12 字節. 而現在僅需要 4+2=6 字節; 平
均每個點佔 12bit. 當然 JPEG 格式裡允許每個點的 C 值都記錄下來; 不過 MPEG 裡
都是按 12bit 一個點來存放的, 我們簡寫為 YUV12.
JPEG 壓縮簡介
-------------
1. 色彩模型
JPEG 的圖片使用的是 YCrCb 顏色模型, 而不是計算機上最常用的 RGB. 關於色
彩模型, 這裡不多闡述. 只是說明, YCrCb 模型更適合圖形壓縮. 因為人眼對圖片上
的亮度 Y 的變化遠比色度 C 的變化敏感. 我們完全可以每個點保存一個 8bit 的亮
度值, 每 2x2 個點保存一個 Cr Cb 值, 而圖像在肉眼中的感覺不會起太大的變化.
所以, 原來用 RGB 模型, 4 個點需要 4x3=12 字節. 而現在僅需要 4+2=6 字節; 平
均每個點佔 12bit. 當然 JPEG 格式裡允許每個點的 C 值都記錄下來; 不過 MPEG 裡
都是按 12bit 一個點來存放的, 我們簡寫為 YUV12.
星期日, 12月 28, 2008
[美工] 等寬字型-for window
等寬字型有時不慎美觀 但是也有人喜歡整齊
1. Courier
2. Courier New
3. Lucida Console
4. Fixedsys
5. Terminal
6. MS Gothic
7. MS Mincho
8. BatangChe
9. DotumChe
10. GulimChe
11. GungsuhChe
12. NSimSun
13. SimHei
14. SimSun
15. 細明體
16. 標楷體
1. Courier
2. Courier New
3. Lucida Console
4. Fixedsys
5. Terminal
6. MS Gothic
7. MS Mincho
8. BatangChe
9. DotumChe
10. GulimChe
11. GungsuhChe
12. NSimSun
13. SimHei
14. SimSun
15. 細明體
16. 標楷體
星期日, 11月 30, 2008
星期二, 11月 18, 2008
[知識] KMP Alogorithm
KMP演算法為一個利用Failure Function(Prefetch Table)的字串比對演算法。時間複雜度為O(Pattern Length+Target Length)。
此演算法最麻煩的部分在於Failure Function的建立。程式碼如下:
手動建立要訣為:(P指Pattern,T指Prefetch Table)
1. 首先(即P[1],因為T[0]必為-1)跟P[0]比對,相同為0(即P[0]+1),不同為-1。
2. 接著,繼續比對時如果前面Failure值為-1,則跟P[0]比,如果不是則跟P[Failure值+1]比。相同則 Failure值+1,不同時則再跟P[0]比,相同則為0,再不同時則為-1。
此演算法最麻煩的部分在於Failure Function的建立。程式碼如下:
void fail2(char *pat)
{
int cnt,pos=0;
int n=strlen(pat);
T[0]= -1;
for(pos=1; pos=0)
{
cnt=T[cnt];
if(pat[pos] == pat[cnt+1])//現在的比對文字 與前一格的Failure Value+1相同
T[pos] = cnt+1;
else
T[pos]=-1;
}
}
手動建立要訣為:(P指Pattern,T指Prefetch Table)
1. 首先(即P[1],因為T[0]必為-1)跟P[0]比對,相同為0(即P[0]+1),不同為-1。
2. 接著,繼續比對時如果前面Failure值為-1,則跟P[0]比,如果不是則跟P[Failure
星期一, 10月 20, 2008
星期三, 5月 07, 2008
[MFC] 攔截 ESC 鍵 或是其他鍵盤指令
基於Cdialog類別所寫出的視窗類別,預設當使用者按下Enter或Esc鍵時,會關閉視窗程式。如果要關閉此功能,需重載PreTranslateMessage函式。改寫如下:
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN:
case VK_ESCAPE:
return TRUE;
break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
星期四, 4月 10, 2008
訂閱:
意見 (Atom)