2013-04-15 2 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); 

gray является Mat, и непосредственно используется в качестве 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, я не думаю, что он будет жаловаться на приведение к указателю на пустоту (хотя, возможно, я ошибаюсь там!).

Примечание: В зависимости от пространства имен, возможно, придется вызвать функцию следующим образом:

cv::findChessboardCorners

Вы должны быть в состоянии непосредственно передать свой gray объект без литья.

+0

Спасибо, что помогает. Но почему функция C не принимает акты? – Tiina

+0

Возможно, он скомпилирован с использованием reinterpret_cast (серый). Но проблема в том, что все еще, это не то поведение, которое вы хотите. Интерфейс C * не * предназначен для работы с объектами, сгенерированными с помощью интерфейса C++ OpenCV. 'cv :: Mat' - это способ работы с изображениями на C++ - это часть интерфейса C++. C способом обработки изображений был тип «IplImage *». Это было бы напрямую передано 'void *' без явного приведения в действие, но тогда вы будете использовать интерфейс C OpenCV. Придерживайтесь C++! – aardvarkk

+0

Спасибо, я думаю, мне стоит больше взглянуть на кастинг. Если у меня будет 15 репутации, я бы поднял пальцы вверх. :) – Tiina

Смежные вопросы