因為要用到2.4版本OPENCV中的級聯分類器,但是BUILDER只支持1.0版本的OPENCV,有沒有什么解決方法?
uj5u.com熱心網友回復:
OpenCV2.1的轉:http://blog.163.com/super_may/blog/static/28544532008101584612266/
C++ Builder中使用OpenCV
<1> 轉換原來的lib檔案
建立如下批處理檔案:
coff2omf -lib:ms lib\cv.lib bcb\cv.lib
coff2omf -lib:ms lib\cvaux.lib bcb\cvaux.lib
coff2omf -lib:ms lib\cvcam.lib bcb\cvcam.lib
coff2omf -lib:ms lib\cvhaartraining.lib bcb\cvhaartraining.lib
coff2omf -lib:ms lib\cxcore.lib bcb\cxcore.lib
coff2omf -lib:ms lib\cxts.lib bcb\cxts.lib
coff2omf -lib:ms lib\highgui.lib bcb\highgui.lib
coff2omf -lib:ms lib\ml.lib bcb\ml.lib
<2> 在WINDOWS系統變數里面添加 OPENCV 為 X:\Program Files\OpenCV,添加搜索路徑X:\Program Files\OpenCV\bin
<3>CB的IDE設定“工具”->“環境變數”->“庫”,在“庫路徑”里面添加
Tools->Options->Environment Options->C++ Options Paths and Directories添加(CB2007)
$(OPENCV)\bcb;$(OPENCV)\bin
<4>新建一個C的控制臺工程,不要VCL支持。然后選擇“工程”->“添加到工程”,把剛才轉換好的.lib檔案添加到工程中即可。
在Directories/Conditonals 里面的Include Path 添加
$(OPENCV)\cv\include;$(OPENCV)\cxcore\include;$(OPENCV)\otherlibs\highgui;
$(OPENCV)\cvaux\include;$(OPENCV)\otherlibs\cvcam\include
OpenCV2.0只有一個目錄$(OPENCV)\include\opencv
在Library Path 里面添加 $(OPENCV)\bcb
General Compilation的Calling Convention改為C
Conditional Defines 中加入 SKIP_INCLUDES
<5> 編輯你的代碼,添加相應的LIB檔案,除錯允許吧:
示例程式:
讀取 lena.jpg 圖象并顯示:
------------------------------------------------------------------------------
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
int main(int argc, char *argv[])
{
IplImage *img = cvLoadImage("lena.jpg");
cvNamedWindow("Image:", 1);
cvShowImage("Image:", img);
cvWaitKey();
cvDestroyWindow("Image:");
cvReleaseImage(&img);
return 0;
}
1、OpenCV2.1 用CMAKE2.8按照VS2005做了configure,在VS2005中編譯生成庫成功;
2、用 COFF2OMF 轉換了 OpenCV 的庫;
3、CB2007 中添加了 OpenCV 的 include 路徑、lib 路徑;
4、修改 highgui.h,該檔案最后有關 New interface 的部分 #include "highgui.hpp",CB2007 下如果包含這個 highgui.hpp 會編譯失敗,其實是可以不需要的。所以作如下修改(添加兩行條件判斷陳述句,如果是 CB 環境就不包含):
把#include "highgui.hpp",修改為以下
#ifndef __BORLANDC__
#include "highgui.hpp"
#endif
5、CB2007 中新建工程,#include <cv.h> #include <highgui.h>,其他什么都暫時不寫;
6、在 Project -> Options 的 Paths and Defines 選項的 Conditional Defines 中加入 SKIP_INCLUDES 和 _FM_NO_REMAP,添加時 Build Configuration 建議選擇 Base;
7、CB2007 編譯,出錯:[BCC32 Error] complex(194): E2316 '_fm_atan2l' is not a member of 'std'
修改fastmath.h檔案
開始修改為
#ifdef __cplusplus
namespace std {
#endif
#ifdef __cplusplus
extern "C" {
#endif
結束修改為
#ifdef __cplusplus
} // extern
} // std
#endif
注意:在BCB中不能使用cvGetSize,自己寫一個 cvGetSize 函式取代 OpenCV 庫中會出錯的 cvGetSize 函式
函式寫法請參考 http://www.opencv.org.cn/index.php/BCB%E4%B8%AD%E4%BD%BF%E7%94%A8OpenCV
取代原因請參考 http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=3424&p=34604&hilit=bcb#p34604
目前我已初步測驗通過。
OpenCV2.1在CBXE下的支持
CBXE的coff2omf 不能用,會出錯,但可以使用RAD2007下的。
uj5u.com熱心網友回復:
我現在把OPENCV和我自己的演算法都封裝成了VC下的靜態庫,準備開始移植到CBC6下了,可是我看資料CBC下好像不是很支持C++撰寫的LIB 怎么解決,OPENCV我都反編譯成了LIB靜態庫,好像寫成DLL都很困難
uj5u.com熱心網友回復:
VC與BCB庫檔案之間的轉換問題VC++的.lib有兩種:一種是靜態DLL,其中包括函式的實際代碼,一種是有DLL生成的.lib,其中并不包含代碼,只是包含DLL的鏈接資訊。對于后一種比較簡單,只需要使用C++ Builder中的命令列工具implib直接對DLL進行進行轉換就可以了。
只有前一種才存在你說的轉換問題。另外一點要看.lib中的內容,如果是普通的C語言函式,可以轉換,如果是C++類,則不能直接轉換為DLL,因為即使你直接編譯為DLL,也只有VC的程式才能使用(那何必費這事),即使C++ Builder也不能呼叫,你必須把類轉換為普通的C語言函式,才能供其他函式呼叫。
經常碰到類似:BCB contains invalid OMF record,type 0x21(possibly COFF)錯誤,該錯誤是由于BCB使用VC的lib兼容不足導致。
解決方法(1):從vc生成的動態庫匯出c++builder可用的匯入庫(注意:不是靜態庫),在Borland目錄下找到Borland\CBuilder6\Bin里面有一個implib.exe,它可以將VC的DLL轉譯為BCB的lib;你只需將VC的DLL拷貝到該同級目錄下,撰寫一個.bat檔案:implib -af XXX.lib XXX.dll 就會將XXX.dll編譯成BCB的XXX.lib再將此lib拷貝到應用程式作業目錄下就可以正常運行了
解決方法(2):把vc生成的靜態庫(注意:不是匯入庫)轉換成c++builder可用的靜態庫;在Borland目錄下找到Borland\CBuilder6\Bin里面有一個coff2omf.exe,先把需要轉換的VC的ml.lib放在C盤根目錄下,然后生成新的C++Builder格式下的ml1.lib檔案,在命令列:
coff2omf -lib:ms c:/ml.lib bcb c:/ml1.lib
uj5u.com熱心網友回復:
高版本CB應該可以直接使用COFF目標檔案(LIB實際上是一個或者多個OBJ的合集)。uj5u.com熱心網友回復:
另外,高版本CB使用CLANG/LLVM編譯器,對第三放庫的兼容性應該更好。所以依賴第三方庫,最好用XE2+。uj5u.com熱心網友回復:
我現在是更新一個BCB6上面的系統 不能用新版本的編譯器了。。。我在用coff2omf轉換LIB時候遇到兩個問題,一個是轉換玩的LIB變得非常小只有1KB,第二個問題是轉換OPENCV原生庫的時候會報錯,寫的是該記憶體不能為written。有辦法解決嗎?這專案我已經折騰很久了 演算法做完還要搞移植 要哭了
uj5u.com熱心網友回復:
coff2omf不能轉換靜態庫,所以你要使用COFF格式的靜態庫,只能換高版本CB。有一個第三方的轉換工具objconv.exe似乎可以轉換幾種格式的obj,COFF、ELF、OMF之類的,包括靜態編譯的,你可以試一試,不過估計也問題不少。
uj5u.com熱心網友回復:
還有一個方法是先用VC++或者intel C++把OPENCV相關部分封裝為DLL,然后在CB中直接呼叫,就可以改動很小了。uj5u.com熱心網友回復:
那我重新寫一個DLL 把OPENCV的DLL封裝起來 再移植到BUILDER下可行嗎
uj5u.com熱心網友回復:
也可以BCB轉2010。參考網文:裝上CB2010,將以前的工程轉過來,首先碰到的問題是AnsiString->UnicodeString。要想把程式徹底的改成Unicode,有以下幾點:
1.選單Project->Options->Directories and Conditionals->_TCHAR maps to char 改為 wchar_t。(C++Builer2010的幫助檔案中說,要使用VCL,這是必須的)。
2.WinMain() 改成 _tWinMain。(新建工程不用改)。
3.const char s[N] = "abc"; 改成 const wchar_t s[N] = L"abc";或者 TEXT("abc");
4.AnsiString 改成 UnicodeString。
5.按鍵回應函式KeyPress( TObject *Sender, char &Key )中的 char 改為 wchar_t。(新建工程不用改)。
然后還可以再升級。
uj5u.com熱心網友回復:
我正在做Opencv的專案,經過測驗2.4.13可以用。用VC編譯生成dll檔案,然后用implib生成庫檔案,就可以呼叫了。但只能用面向程序的部分,面向物件的不行。uj5u.com熱心網友回復:
從 C++ Builder 6 到 XE2 的升級問題匯總
http://download.csdn.net/detail/wdkylin/4379320
uj5u.com熱心網友回復:
bcb 6.0工程平移C++ builder xe8環境http://blog.csdn.net/liuhuili23/article/details/47859471
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67647.html
上一篇:求解
