2013-04-15 227 views
0

似乎我是唯一一個在Opencv 2.4.3中遇到過這個問題的人。無法從'cv :: Mat'轉換爲'void *'

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html 以下代碼公佈在官方網站:

Size patternsize(8,6); //interior number of corners 
Mat gray = ....; //source image 
vector<Point2f> corners; //this will be filled by the detected corners 

//CALIB_CB_FAST_CHECK saves a lot of time on images 
//that do not contain any chessboard corners 
bool patternfound = findChessboardCorners(gray, patternsize, corners, 
     CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE 
     + CALIB_CB_FAST_CHECK); 

if(patternfound) 
    cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), 
    TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); 

drawChessboardCorners(img, patternsize, Mat(corners), patternfound); 

grayMat,它被直接用作void*

但在我的Visual Studio 2010中,它不停地說錯誤

Error 1 error C2664: 'cvFindChessboardCorners' : cannot convert parameter 1 from 'cv::Mat' to 'const void *' 22 

而且,我曾嘗試以下,但仍然是同樣的錯誤。

static_cast<void*>(gray) 
Error 1 error C2440: 'static_cast' : cannot convert from 'cv::Mat' to 'void *' 21 


(void*)gray 
Error 1 error C2440: 'type cast' : cannot convert from 'cv::Mat' to 'void *' 21 

我使用OpenCV 2.4.3。請幫忙。

回答

1

OpenCV的文檔中的示例代碼使用C++接口(findChessboardCorners)。您正在調用C接口(cvFindChessboardCorners)。如果你可以使用C++接口,我會強烈推薦它。我認爲你應該能夠使用C++接口,因爲如果你的代碼編譯爲C,我不認爲它會抱怨把一個轉換爲void指針(雖然也許我錯了!)。

注:根據命名空間,您可能需要調用該函數是這樣的:

cv::findChessboardCorners

您應該能夠直接傳遞您的gray對象,而無需進行任何造型。

+0

謝謝,這有幫助。但爲什麼C函數不接受任何演員? – Tiina

+0

它可能使用reinterpret_cast (灰色)進行編譯。但麻煩在於,即使如此,這不是你想要的行爲。 C接口不是用來處理由OpenCV的C++接口生成的對象的。 'cv :: Mat'是處理圖像的C++方式 - 它是C++接口的一部分。處理圖像的C方式是'IplImage *'類型。這將直接轉換爲'void *'而不需要顯式強制轉換,但是您將使用OpenCV的C接口。堅持用C++! – aardvarkk

+0

謝謝,我想我應該查看更多關於鑄造的信息。如果我有15的聲望,我會大拇指。 :) – Tiina

相關問題