2015-10-22 3 views
1

Я пытался выяснить документированный подход к использованию OpenCV fitEllipse.Понимание подхода OpenCV fitEllipse

Его можно найти здесь: http://docs.opencv.org/ref/master/de/dc7/fitellipse_8cpp-example.html

Проблема заключается в том, что он применяет порог на изображение, на основе позиции ползунка, но только линия, связывающая значение ползунка, к исходному изображению является:

Mat bimage = image> = sliderPos;

Тем не менее, что = = нет смысла для меня, и с помощью imshow на bimage/image показано их равными.

Может кто-нибудь объяснить, что там происходит? Прости, если это очевидно. Я не отличный программист на C++ (пока).

ответ

1

Как описано в documentation это бинаризации (0 или 255):

сравнения: cmpop В, А cmpop альфа, альфа cmpop А, где cmpop является одним из>,> =, ==,! =, < =, <. Результат сравнения представляет собой 8-разрядный одну маски канала, элементы которого установлены на 255 (если конкретный элемент или пара элементов удовлетворяет условие) или 0.


Теперь я пытаюсь объяснить более техническая часть функций. Следуя example you gave первых, мы должны знать типы переменных:

  • image и bimage являются cv::Mat
  • sliderPos имеет тип int.

Функции для оператора >= можно найти в mat.hpp, который косвенным образом включен другие включают в себя. Функция, которую мы искали это:

MatExpr cv::operator>= (const Mat &a, double s) 

В matop.cpp он называет:

MatOp_Cmp::makeExpr(e, CV_CMP_GE, a, b); 

, который затем вызывает (строка 1408):

res = MatExpr(&g_MatOp_Cmp, cmpop, a, b, Mat(), 1, 1); 

Это внутренне применяет общий оператор на заданные параметры (здесь и матрицы a и b). Результат (таким образом, часть image >= sliderPos) имеет тип MatExpr. Наконец следующий function из Mat bimage называется:

Mat& cv::Mat::operator= (const MatExpr & expr) 

который устанавливает Mat bimage к полученному значению MatExpr объекта.

+0

Это похоже ответ. Я должен проверить это, хотя, так как я почти уверен, что наличие как «бимагов», так и «изображений» оказалось одинаковым с использованием imshow. Я сделал двоичные изображения с использованием порога или inRange (я думаю), но никогда не видел, что> = трюк. Я отвечу на него после тестирования. – SOMN

1

В этой строке:

createTrackbar("threshold", "result", &sliderPos, 255, processImage); 

четвертый параметр (255) представляет собой максимальное значение ползунка. Минимум всегда 0. Таким образом, sliderPos принимает значение в диапазоне [0,255].

Эта линия:

Mat bimage = image >= sliderPos; 

является простой бинаризацией: bimage представляет собой двоичное изображение, где каждый пиксел имеет значение 255, если соответствующее значение в image является >=, чем sliderPos, или 0 в противном случае. Это так же, как:

Mat bimage; 
threshold(image, bimage, sliderPos-1, 255, THRESH_BINARY); 

bimage и image различны. bimage имеет только 0 или 255 значения, а image может иметь любое значение в диапазоне [0,255].

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