Я делаю некоторое распознавание эллипса в изображении и для этого я открываю простое изображение:
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.
Каков наилучший (или рекомендуемый) способ выполнить ту же обработку и получить окупаемость инвестиций в исходном изображении, показывая ход выполнения алгоритма?
главная проблема в том, что у вас не может быть изображения, которое частично 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
Других решений пока нет …