2015-11-24 2 views
1

Я работаю с OpenCV 2.4.11 в C на Code :: Blocks, в частности через книгу O'Reilly Learning OpenCV. Раздел по алгоритму водораздела был немного коротким, поэтому я подумал, что немного поиграю с ним, чтобы узнать, как именно он работает. Тем не менее, каждый раз, когда я вызываю функцию, я получаю следующее сообщение об ошибке:cvWatershed неподдерживаемый формат или комбинация форматов

OpenCV Error: Unsupported format or combination of formats (Only 32-bit, 1-chann el output images are supported) in cvWatershed

Моя программа до сих пор очень просто:

int main(int arg, int arg2) { 
//open windows 
cvNamedWindow("Input", 1); 
cvNamedWindow("Markings", 1); 

//load images 
IplImage* input = cvLoadImage("ActualDoorPhoto.jpg", CV_LOAD_IMAGE_COLOR); 
assert(input != NULL); 

IplImage* markingstemp = cvLoadImage("ActualMarkingTest.jpg", CV_LOAD_IMAGE_COLOR); 
assert(markingstemp != NULL); 

//prepare markings 
IplImage* markings = cvCreateImage(cvGetSize(markingstemp), 32, 1); 
CvMat* markmat = cvCreateMat(input->width, input->height, CV_32FC1); 

cvWatershed(input, markmat); 

cvShowImage("Input", input); 
cvShowImage("Markings", markings); 
cvWaitKey(0); 

return 0; 
} 

Я пытался поставить обе маркировки и markmat в качестве второго аргумента для cvWatershed , а также несколько других вещей (особенно маркировка с контурами markingstemp, нарисованных на нем), но каждый раз, когда я получаю ту же ошибку. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Хорошо, я пробовал это, и ошибка изменилась на «Ошибка OpenCV: размеры входных аргументов не совпадают» (входные и выходные изображения должны иметь одинаковый размер) в cvWatershed « Это кажется странным с самого своего размера берется из другого. Есть идеи по этому поводу? – Logician

+0

Вы инвертируете размеры: 'CvMat * markmat = cvCreateMat (input-> height, input-> width, CV_32FC1);' Вероятно, формат также должен быть CV_32SC1'. – Miki

+0

О, черт, да, это сработало. Благодаря! Кажется, это глупый вопрос. – Logician

ответ

1

Вы инвертируете размеры выходной матрицы. Оно должно быть:

CvMat* markmat = cvCreateMat(input->height, input->width, CV_32FC1); 

Формат должен также, вероятно, будет изменен на CV_32SC1.

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