(Адаптивное) пороговое значение при ошибке opencv (неверный аргумент (неизвестный тип массива) в cvarrToMat)

Я пытаюсь использовать пороговое значение в своем видеопотоке, но это не работает.

Мой видеопоток:

Mat *depthImage = new Mat(480, 640, CV_8UC1, Scalar::all(0));

Затем я пытаюсь сделать адаптивный порог (также не работает с обычным порогом).

for(;;){

    if( wrapper->update()){


        wrapper->getDisplayDepth(depthImage);

        cvAdaptiveThreshold(depthImage, depthImage,255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY,75,10);


        imshow("Depth", *depthImage);

    }

    int k = waitKey(25);
    if(k == 27 ) exit(0);
}

Я получаю эту ошибку:

Ошибка OpenCV: неверный аргумент (неизвестный тип массива) в cvarrToMat, файл /Users/olivierjanssens/source/OpenCV-2.3.1/modules/core/src/matrix.cpp, строка 646 завершается, вызывая исключение

Что я делаю неправильно, я могу получить отображение и отлично видеть поток. Но когда я добавляю это пороговое значение, я получаю ранее упомянутую ошибку. (кстати, я новичок в opencv).

Спасибо заранее!


person Olivier_s_j    schedule 24.11.2011    source источник
comment
Вы уверены, что эта строка верна? imshow("Depth", *depthImage);   -  person Alessandro Vendruscolo    schedule 24.11.2011
comment
да, потому что эта линия работает без пороговой линии. И если я удалю его, ничего не изменится в этой настройке.   -  person Olivier_s_j    schedule 24.11.2011
comment
И если я помещу пороговую строку в комментарий и добавлю, например, это: 'cvCircle (depthImage, cvPoint (point.X, point.Y), 20, cvScalar (0,255,0), 1);' Чтобы нарисовать круг, выдает ту же ошибку.   -  person Olivier_s_j    schedule 24.11.2011


Ответы (1)


Ваш depthImage является указателем на cv::Mat, что мне кажется странным...

... но если вы используете синтаксис C++, вам нужно использовать версия адаптивного порога C++, работающая с cv::Mat, со следующим определением:

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,
    int adaptiveMethod, int thresholdType, int blockSize, double C);

который должен иметь префикс cv::, если вы еще не используете это пространство имен.

Например:

Mat *depthImage; // Obtain this using your method
Mat image = *depthImage;  // Obtain a regular Mat to use (doesn't copy data, just headers)

adaptiveThreshold(image, image,255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY,75,10);

imshow("Depth Image", *depthImage);
// OR
imshow("Depth Image", image);
person Chris    schedule 24.11.2011
comment
Большое спасибо, это работает. Я все еще немного новичок в С++, поэтому извините за странный вопрос. - person Olivier_s_j; 24.11.2011
comment
При использовании обнаружения краев следует ли использовать cvCanny(depthImage, depthImage, 1.0, 1.0, 3); ? или использовать эту переменную изображения? - person Olivier_s_j; 24.11.2011
comment
Я определил это Mat image, потому что мне не нравится работать с указателями, и потому, что обычно так устроено большинство функций C++ OpenCV. Если бы вы могли изменить способ получения изображения из своего видеопотока (вы не публикуете какие-либо из этих деталей, поэтому я не знаю, сможете ли вы), чтобы указать Mat в своем коде, а не Mat*, тогда это было бы проще. - person Chris; 24.11.2011
comment
Кроме того, помните, что вам нужны функции C++ из OpenCV, см. cv: :Осторожная документация и этот справочный сайт в целом. - person Chris; 24.11.2011
comment
Да, я посмотрел, то, как вы определили, работает. Я работаю с оберткой и в настоящее время не хочу ничего менять в обертке, так что ваш способ идеален :). - person Olivier_s_j; 24.11.2011
comment
Кроме того, помните, что при настройке структуры OpenCV Mat назначение Mat image = *depthImage не копирует никаких данных, оно просто устанавливает новые заголовки для изображений, указывающих на те же данные, хранящиеся в depthImage. Таким образом, использование любого из них в дальнейших функциях изменит оба. - person Chris; 24.11.2011