線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:30820
推到 Plurk!
推到 Facebook!

請教BCB內使用OpenCV影像函式庫

尚未結案
jakdon
一般會員


發表:2
回覆:1
積分:0
註冊:2005-09-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-27 15:21:49 IP:140.118.xxx.xxx 未訂閱
剛開始碰影像的東西,用的是BCB軟體 同學有介紹Intel公開的一套OpenCV的影像函式庫 上網download到軟體,但就是不知道從何下手去使用    目前已經有完成將 .lib檔 轉成 .dll檔 在include和library路徑上的設定還有一些其它函式庫的使用 都不是很有概念 想問一下討論區的先進們要如何去設定   感恩再感恩    
fusung
中階會員


發表:26
回覆:169
積分:99
註冊:2003-11-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-27 20:29:37 IP:140.114.xxx.xxx 未訂閱
是否有人有把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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-27 21:00:53 IP:61.222.xxx.xxx 未訂閱
Open Source Computer Vision Library Community  這是Yahoo討論區,必須先聲請Yahoo帳號 < href="http://dir.groups.yahoo.com/group/OpenCV/">http://dir.groups.yahoo.com/group/OpenCV/ Files\裡面有許多整理好的資料
  • Borland C builder\ Using OpenCV with Borland
  • Files > Documentation\ Simple Image Analysis by Moments.pdf
  • Files > Documentation\ Wavelet Chapter New.zip
  • Files > Examples\
好康的資料太多了,請自行享用囉 <> <> >
------


The first step toward proving things for yourself is to understand how others have done it before!

jakdon
一般會員


發表:2
回覆:1
積分:0
註冊:2005-09-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-12-13 16:12:37 IP:140.118.xxx.xxx 未訂閱
感謝再感謝!!! 我有加入那個討論區了 現階段還在嘗試中.. 但已經有點感覺,不知道有沒有proj可以參考一下呢?
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-09-08 23:35:22 IP:1.164.xxx.xxx 未訂閱
用BCB6呼叫OpenCV 2.4.2部分dll的方法

1.下載最新版OpenCV
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/

2.解壓縮取出.dll檔和.h檔
\build\x86\vc10\bin\opencv_core242.dll
\build\x86\vc10\bin\opencv_highgui242.dll
\build\x86\vc10\bin\opencv_imgproc242.dll
\build\common\tbb\ia32\vc10\tbb.dll

除了這些其他.h的檔案不要取,因為那是給c 用的,BCB6編譯時會出現錯誤訊息
將檔案放在對應的目錄下(opencv2\core,opencv2\highgui,opencv2\imgproc)
\build\include\opencv2\core\core_c.h
\build\include\opencv2\core\types_c.h
\build\include\opencv2\highgui\highgui_c.h
\build\include\opencv2\imgproc\imgproc_c.h
\build\include\opencv2\imgproc\types_c.h


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;yheight;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是個巨集,定義在\core\types_c.h的第154行
#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
編輯記錄
bugmans 重新編輯於 2012-09-08 17:02:53, 註解 無‧
bugmans 重新編輯於 2012-09-08 17:10:20, 註解 無‧
bugmans 重新編輯於 2012-09-08 17:13:09, 註解 無‧
bugmans 重新編輯於 2012-09-08 17:15:09, 註解 無‧
bugmans 重新編輯於 2012-09-08 17:16:50, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-09-09 01:15:52 IP:114.42.xxx.xxx 訂閱
好文章,感謝分享! ^^

此外,關於我部落格文章 ( 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是個巨集,定義在\core\types_c.h的第154行
# 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-11-03 19:20:15 IP:1.164.xxx.xxx 未訂閱
 利用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的優點就無法發揮出來。
我們開始看原始碼
\modules\highgui\src\cap.cpp
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函式庫,網址如下



\modules\highgui\src\cap_dshow.cpp
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 重新編輯於 2012-11-03 05:25:25, 註解 無‧
bugmans 重新編輯於 2012-11-03 05:34:12, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-01-13 11:59:43 IP:1.164.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2013-06-16 15:45:38 IP:1.164.xxx.xxx 未訂閱
程式碼出自這裡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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2016-03-09 18:47:02 IP:163.13.xxx.xxx 訂閱
各位前輩
我照著上面的實作,可以順利讓bcb6 開啟圖片。

不過我需要使用到legacy.hpp , 裡面的庫
但是我無法順利加入這個.hpp,不知道該如何解決這個問題
系統時間:2024-04-25 10:24:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!