OpenCV — Использование ROI после cvtColor

Я делаю некоторое распознавание эллипса в изображении и для этого я открываю простое изображение:

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

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

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

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

cvtColor(roi, roi, CV_BGR2GRAY);

применение порога:

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

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

cvtColor(roi, roi, CV_GRAY2BGR);

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

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

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

3

Решение

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

Мое решение было бы — поработать с копией 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
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]