2013-11-08 3 views
3

Я делаю некоторое признание Эллипс в изображении, и для того, чтобы сделать это я открываю простое изображение:OpenCV - Использование ROI после cvtColor

img = imread("M:/Desktop/PsEyeRight.jpg", CV_LOAD_IMAGE_COLOR); 

выбирающий рентабельность инвестиций (это единственный способ, которым я мог видеть установить ROI в OpenCV 2.4.6, где старая библиотека была cvSetImageROI() и cvResetImageROI(), который я думаю, более простой):

Mat roi(img, Rect(Point(205, 72), Point(419,285))); 

изменяя его цветовое пространство с cvtColor:

cvtColor(roi, roi, CV_BGR2GRAY); 

применение Threshold:

threshold(roi, roi, 150, 255, THRESH_BINARY); 

Тогда я в findContours с клонированным образом, так как findContours изменяет изображение передается в функции, а затем изменить ROI обратно BGR цветового пространства:

cvtColor(roi, roi, CV_GRAY2BGR); 

И нарисуйте все найденные эллипсы в рои.

Когда я показываю roi, я вижу, что все работает на 100%, но я ожидал, что когда я покажу оригинальное изображение, это будет оригинальное изображение с ROI в пороге и чертежами внутри него, но вместо этого я просто получить исходное изображение, так как ничего не изменилось. Я считаю, что это происходит потому, что cvtColor копирует roi, поэтому он больше не указывает на img.

Каков наилучший способ (или рекомендуется) выполнить эту же обработку и получить ROI внутри исходного изображения, показывая ход алгоритма?

ответ

4

Основная проблема заключается в том, что у вас не может быть изображения, которое частично является 3chan/rgb и частично 1chan/gray.

Моим решением было бы работать над копией roi в 1-м месте, а затем преобразовать его обратно в rgb и вставить в исходное изображение.

img = imread("M:/Desktop/PsEyeRight.jpg", CV_LOAD_IMAGE_COLOR); // original 
Mat roi(img, Rect(Point(205, 72), Point(419,285))); 
Mat work = roi.clone(); 
cvtColor(work , work , CV_BGR2GRAY); 
threshold(work , work , 150, 255, THRESH_BINARY); 
// findContours(work,...); 
cvtColor(work , roi, CV_GRAY2BGR); //here's the trick 
+0

это работает ... Я не видел cvtColor() как «копир», огромное спасибо! – mFeinstein

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