我试图找出 OpenCV fitEllipse 用法的记录方法。
可以在这里找到:http://docs.opencv.org/ref/master/de/dc7/fitellipse_8cpp-example.html
问题在于它根据 slider 位置对图像应用了一个阈值,但将 slider 值与原始图像相关的唯一一行是:
Mat bimage = image >= sliderPos;
然而 >= 对我来说毫无意义,并且在 bimage/image 上使用 imshow 显示它们是相等的。
有人可以解释一下那里发生了什么吗? 如果很明显,我很抱歉。我还不是一个出色的 C++ 程序员。
最佳答案
如 documentation 中所述它是二值化(0 或 255):
Comparison: A cmpop B, A cmpop alpha, alpha cmpop A, where cmpop is one of >, >=, ==, !=, <=, <. The result of comparison is an 8-bit single channel mask whose elements are set to 255 (if the particular element or pair of elements satisfy the condition) or 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
对象的值。
关于c++ - 了解 OpenCV fitEllipse 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283666/