請教BCB內使用OpenCV影像函式庫 |
尚未結案
|
jakdon
一般會員 發表:2 回覆:1 積分:0 註冊:2005-09-06 發送簡訊給我 |
|
fusung
中階會員 發表:26 回覆:169 積分:99 註冊:2003-11-25 發送簡訊給我 |
是否有人有把opencv這套影像函式庫在BCB上使用過呢?http://delphi.ktop.com.tw/topic.php?topic_id=79178 【轉載】http://www.mvonline.com.cn/main/html/200511/1213.html 經過昨晚幾小時的奮鬥,終於解決如何在C Bbuilder 6.0下配置OpenCV的問題,現將所得與各位同仁共用。以期共同進步。
1.Opencv的庫是屬於VC的。所以即使能正確配置BCB環境,在編譯時也會出現連接錯誤:
[Linker Error] '…\bin\ .lib' contains invalid OMF record, type 0x21 (possibly COFF).
其原因就在於使用了VC的庫。
解決方法:
BCB安裝目錄下BIN中有一個檔COFF2OMF.EXE,可用此檔把VC的庫轉換為BCB的庫。另外還可以用如下兩個檔:impdef.exe及implib.exe。
因此,第一步需要將OpenCV安裝目錄下LIB中的幾個庫函數轉換為BCB庫函數。如:cv.lib、highgui.lib等。
2.配置OpenCV的頭檔路徑。
在BCB環境下,選擇project中的options,對話方塊,單擊Directories/Condtionals標籤。
在Directories下的include path中加入OpenCV的頭檔所在的路徑。注意,cv和highgui的頭檔在不同地方,分別加入。其他類推。在Library path中加入你轉換得到的庫(BCB)的路徑。當然這一步可以不做。可以在3中完成。
3.在BCB工程中加入OpenCV的庫。
啟動project manager,可以看到已有此工程的幾個檔。右擊工程名,選擇ADD,然後選擇你要加的庫檔。通常,要把你程式中用到的庫都加進去。 好了,一切OK了。這是一種靜態庫的加法。還有動態庫的加法,在探索中。
The first step toward proving things for yourself is to understand how others have done it before!
------
The first step toward proving things for yourself is to understand how others have done it before! |
fusung
中階會員 發表:26 回覆:169 積分:99 註冊:2003-11-25 發送簡訊給我 |
Open Source Computer Vision Library Community
這是Yahoo討論區,必須先聲請Yahoo帳號
< href="http://dir.groups.yahoo.com/group/OpenCV/">http://dir.groups.yahoo.com/group/OpenCV/ Files\裡面有許多整理好的資料
------
The first step toward proving things for yourself is to understand how others have done it before! |
jakdon
一般會員 發表:2 回覆:1 積分:0 註冊:2005-09-06 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
用BCB6呼叫OpenCV 2.4.2部分dll的方法
1.下載最新版OpenCV http://sourceforge.net/projects/opencvlibrary/files/opencv-win/ 2.解壓縮取出.dll檔和.h檔 除了這些其他.h的檔案不要取,因為那是給c 用的,BCB6編譯時會出現錯誤訊息 將檔案放在對應的目錄下(opencv2\core,opencv2\highgui,opencv2\imgproc) 3.利用impdef.exe產生.def檔 新增impdef.bat檔,輸入以下內容 impdef.exe opencv_core242.def opencv_core242.dll impdef.exe opencv_highgui242.def opencv_highgui242.dll impdef.exe opencv_imgproc242.def opencv_imgproc242.dll 存檔後執行impdef.bat會產生三個.def檔 4.開啟.def檔將c 函式名稱刪除,只留c函式名稱 (以opencv_core242.def為例) LIBRARY OPENCV_CORE242.DLL EXPORTS ??0?$AutoBuffer@C$0BAAI@@cv@@QAE@XZ @8 ; ??0?$AutoBuffer@C$0BAAI@@cv@@QAE@XZ 這 ??0?$AutoBuffer@D$0BAAI@@cv@@QAE@I@Z @9 ; ??0?$AutoBuffer@D$0BAAI@@cv@@QAE@I@Z 些 ??0?$AutoBuffer@E$0BAAI@@cv@@QAE@I@Z @10 ; ??0?$AutoBuffer@E$0BAAI@@cv@@QAE@I@Z 刪 ??0?$AutoBuffer@E$0BAAI@@cv@@QAE@XZ @11 ; ??0?$AutoBuffer@E$0BAAI@@cv@@QAE@XZ 除 ??0?$AutoBuffer@F$0IAI@@cv@@QAE@I@Z @12 ; ??0?$AutoBuffer@F$0IAI@@cv@@QAE@I@Z ??0?$AutoBuffer@F$0IAI@@cv@@QAE@XZ @13 ; ??0?$AutoBuffer@F$0IAI@@cv@@QAE@XZ ??0?$AutoBuffer@G$0IAI@@cv@@QAE@I@Z @14 ; ??0?$AutoBuffer@G$0IAI@@cv@@QAE@I@Z ........ cvAbsDiff @1373; cvAbsDiff 這 cvAbsDiffS @1374; cvAbsDiffS 些 cvAdd @1375; cvAdd 保 cvAddS @1376; cvAddS 留 cvAddWeighted @1377; cvAddWeighted cvAlloc @1378; cvAlloc ........ 5.將c函式名稱加上底線(可用文字編輯器的取代功能將" cv"取代為" _cv") (以opencv_core242.def為例) LIBRARY OPENCV_CORE242.DLL EXPORTS _cvAbsDiff @1373; cvAbsDiff _cvAbsDiffS @1374; cvAbsDiffS _cvAdd @1375; cvAdd _cvAddS @1376; cvAddS _cvAddWeighted @1377; cvAddWeighted _cvAlloc @1378; cvAlloc ........ 後面這些可以不用加底線 更改後存檔 6.利用implib.exe產生.lib檔 新增implib.bat檔,輸入以下內容 implib.exe opencv_core242.lib opencv_core242.def implib.exe opencv_highgui242.lib opencv_highgui242.def implib.exe opencv_imgproc242.lib opencv_imgproc242.def 存檔後執行implib.bat會產生三個.lib檔 7.開始寫程式 我只節錄將IplImage轉換成TBitmap副程式 雖然OpenCV可以用cvShowImage來顯示圖片,但比較沒有彈性 所以我在網路上找到這段程式,可以將OpenCV的IplImage轉換成BCB的TBitmap http://blog.finalevil.com/2008/03/opencv03.html 直接將圖顯示在Image中,而不是靠cvShowImage來顯示 void __fastcall TForm1::IplImageToTBitmap(IplImage *cvImage,Graphics::TBitmap *Bitmap) { Bitmap->Width=cvImage->width; Bitmap->Height=cvImage->height; if(cvImage->depth == IPL_DEPTH_8U && cvImage->nChannels == 3) Bitmap->PixelFormat=pf24bit; int offset=0; for(int y=0;y {memcpy(Bitmap->ScanLine[y],cvImage->imageData offset,cvImage->widthStep); offset =cvImage->widthStep; } } 8.後記 以前在OpenCV 2.1及2.2時我曾嘗試用BCB6來寫OpenCV程式但都失敗了 我在google所找到的資料就是用更新版的C Builder 2007來編譯 我也曾試著OpenCV1.1的方法用implib.exe直接從OpenCV2.X的.dll產生出.lib 但加入lib檔後編譯時總是出現以下錯誤訊息而卡住 [Linker Error] Unresolved external '_cvLoadImage' referenced from C:\test\UNIT1.OBJ [Linker Error] Unresolved external '_cvReleaseImage' referenced from C:\test\UNIT1.OBJ 直到最近我在這裡找到答案 http://aftcast.pixnet.net/blog/post/22191720-使用vc與bcb開發的dll 例如highgui_c.h中對cvLoadImage的宣告為 CVAPI(IplImage*) cvLoadImage( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR)); 其中CVAPI是個巨集,定義在 #ifndef CVAPI # define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL #endif 其中CV_CDECL在第112行定義為__cdecl 而__cdecl的呼叫慣例在vc和bcb有些許不同,bcb需要在函式前面加上底線,但vc不需要 這就可以解釋為什麼會出現這個錯誤的原因 [Linker Error] Unresolved external '_cvLoadImage' referenced from C:\test\UNIT1.OBJ [Linker Error] Unresolved external '_cvReleaseImage' referenced from C:\test\UNIT1.OBJ 因為bcb要的是有加底線的lib但之前產生的都沒有加底線 呼叫慣例 原始函式 Borland C Builder Microsoft Visual C __cdecl MyFunc_cdcel _MyFunc_cdcel MyFunc_cdcel 另外網頁也有提到加-a參數就可以為函式加上底線,但實際測試時卻沒有 implib -a -c -f mybcb.lib myvc.dll 9.注意事項 執行時若出現這個錯誤訊息,代表你的電腦要先安裝VC 2010的執行套件 "這個應用程式無法啟動,因為找不到MSVCP100.dll,重新安裝應用程式可能可以解決這個問題。" Microsoft Visual C 2010 Redistributable Package (x86) http://www.microsoft.com/en-us/download/details.aspx 執行時若缺少vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe bin資料夾底下還有很多的.dll檔,是不是可以靠相同的方法來產生對應的lib檔? 我在測試的時候發現有好幾個.dll檔所產生的.def檔內容只有c 的函式沒有c函式 這可能就是2.0版後新增的,那本篇文章也沒辦法解決,大體上就是呼叫2.x的dll來延續1.x的寫法 10.範例程式下載 http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=104470 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
好文章,感謝分享! ^^
此外,關於我部落格文章 ( http://aftcast.pixnet.net/blog/post/22191720-使用vc與bcb開發的dll ) 的文章裡,在使用 implib -a -c -f mybcb.lib myvc.dll方式 於opencv上並沒加入_ 的情形,有時間的話我會再去追一下是什麼原因,當時沒用opencv來測… 也許此法有什麼讓我誤解或是其他的問題。 不過,我個人幾乎都是使用def的方式來處理所有dll,這樣比較"被自己掌控",雖然過程可能讓新手會比較confuse… 我建議此種方式是最好的! 謝謝你對影像相關與directx大量無私的提供solution與sample給大家。讚! ===================引 用 bugmans 文 章=================== 以前在OpenCV 2.1及2.2時我曾嘗試用BCB6來寫OpenCV程式但都失敗了 我也曾試著OpenCV1.1的方法用implib.exe直接從OpenCV2.X的.dll產生出.lib [Linker Error] Unresolved external '_cvLoadImage' referenced from C:\test\UNIT1.OBJ 直到最近我在這裡找到答案 例如highgui_c.h中對cvLoadImage的宣告為 其中CVAPI是個巨集,定義在 # define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL 其中CV_CDECL在第112行定義為__cdecl 這就可以解釋為什麼會出現這個錯誤的原因 [Linker Error] Unresolved external '_cvReleaseImage' referenced from C:\test\UNIT1.OBJ 呼叫慣例 原始函式 Borland C Builder Microsoft Visual C 另外網頁也有提到加-a參數就可以?函式加上底線,但實際測試時卻沒有 implib -a -c -f mybcb.lib myvc.dll
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2012-09-08 11:17:13, 註解 無‧
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
利用OpenCV讀取攝影機畫面
#include "opencv2\core\core_c.h" #include "opencv2\highgui\highgui_c.h" #include "opencv2\imgproc\imgproc_c.h" int main() { CvCapture *capture; IplImage *frame; capture = cvCaptureFromCAM(0); cvNamedWindow("Webcam",CV_WINDOW_AUTOSIZE); while(true) {frame = cvQueryFrame(capture); cvShowImage("Webcam",frame); if(cvWaitKey(10)>=0) break; } cvReleaseCapture(&capture); cvDestroyWindow("Webcam"); return 0; } 這個範例就只是將程式的迴圈改成Timer,cvShowImage改用TImage顯示,程式請參閱附件。 在以前OpenCV1.1的時候採用VFW架構,是採用無限迴圈取得畫面,只是到了OpenCV2.x採用DirectShow架構,而DirectShow提供callback的功能,當有新的畫面時就呼叫你當初設定的函數來處理畫面,但OpenCV為了向下相容還是要你用無限迴圈來查詢是否有新的畫面,callback的優點就無法發揮出來。 我們開始看原始碼 CV_IMPL CvCapture * cvCreateCameraCapture (int index) { switch (domains[i]) { #ifdef HAVE_VIDEOINPUT case CV_CAP_DSHOW: capture = cvCreateCameraCapture_DShow (index); if (capture) return capture; break; } #endif } 原來OpenCV採用VideoInput函式庫,網址如下 CvCapture* cvCreateCameraCapture_DShow( int index ) { CvCaptureCAM_DShow* capture = new CvCaptureCAM_DShow; return capture } 只是將CvCaptureCAM_DShow物件找出來,發現公開的函式都是在OpenCV1.x舊的架構下所規範的。class CvCaptureCAM_DShow : public CvCapture { public: CvCaptureCAM_DShow(); virtual ~CvCaptureCAM_DShow(); virtual bool open( int index ); virtual void close(); virtual double getProperty(int); virtual bool setProperty(int, double); virtual bool grabFrame(); virtual IplImage* retrieveFrame(int); virtual int getCaptureDomain() { return CV_CAP_DSHOW; } protected: void init(); int index, width, height,fourcc; IplImage* frame; static videoInput VI; }; 而videoInput VI又被關在protected裡面取不出來,代表DirectShow的其他函式都無法使用了。 class videoInput { ... //可以將攝影機的名字取出來 static char * getDeviceName(int deviceID); //使用Callback當有新畫面時就會呼叫你的函式來處理,就不需要無限迴圈一直問有沒有新的畫面 void setUseCallback(bool useCallback); //藉由IAMVideoProcAmp來調整亮度,對比,飽和度... //在OpenCV就呼叫cvGetCaptureProperty設定 bool setVideoSettingFilter(int deviceID, long Property, long lValue, long Flags = 0, bool useDefaultValue = false); //藉由IAMCameraControl來調整Pan,Tile,Roll,Zoom,Exposure,Iris,Focus //在OpenCV就呼叫cvGetCaptureProperty設定 bool setVideoSettingCamera(int deviceID, long Property, long lValue, long Flags = 0, bool useDefaultValue = false); ... } 雖然DirectShow有提供ISampleGrabberCB::SampleCB提供Callback的功能,但VideoInput卻只是用newFrame變數註記有新畫面,VideoInput再檢查newFrame變數才知道是否新的畫面。 STDMETHODIMP SampleCB(double , IMediaSample *pSample) { pSample->GetPointer(&ptrBuffer); EnterCriticalSection(&critSection); memcpy(pixels, ptrBuffer, latestBufferLength); newFrame = true; LeaveCriticalSection(&critSection); } 檔案下載http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=104692 執行時若缺少以下檔案 opencv_highgui242.dll opencv_imgproc242.dll opencv_core242.dll tbb.dll |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
http://trac.koka-in.org/libdecodeqr
這是能從圖片中讀取QR code的library,只是實際測試後發現很多圖片都讀不出來。 要修改兩個地方,BCB6才能編譯 imagereader.cpp第655行的 cvWarpPerspectiveQMatrix(spts,dpts,map); 改為 cvGetPerspectiveTransform(spts,dpts,map); imagereader.h第41行新增 #define __BEGIN__ { #define __END__ goto exit; exit: ; } 檔案下載:http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=104938 執行時若缺少以下檔案 opencv_highgui242.dll opencv_imgproc242.dll opencv_core242.dll tbb.dll 請到這裡下載http://delphi.ktop.com.tw/download.php?download=upload/504b6578380e3_OpenCV2.42_for_BCB6.rar 執行時若缺少vcl60.bpl請到這裡下載 http://delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe 搜尋關鍵字:qr_decoder_open,qr_decoder_decode_image,qr_decoder_get_header,qr_decoder_get_body,qr_decoder_close |
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
程式碼出自這裡http://seeyababy.blogspot.tw/2010/04/opencv-face-detection.html
執行時若缺少以下檔案 opencv_highgui242.dll opencv_imgproc242.dll opencv_core242.dll tbb.dll 執行時若缺少vcl60.bpl請到這裡下載 delphi.ktop.com.tw/download/upload/45b8c86f862d6_VCL Runtime Library.exe
搜尋關鍵字:CV_HAAR_DO_CANNY_PRUNING,cvHaarDetectObjects,cvReleaseHaarClassifierCascade |
c112232002
一般會員 發表:0 回覆:1 積分:0 註冊:2011-05-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |