我试图找出OpenCV fitEllipse用法的文档化方法。
可在此处找到:http://docs.opencv.org/ref/master/de/dc7/fitellipse_8cpp-example.html
问题在于它根据滑块位置对图像应用阈值,但是与滑块值相关的唯一线与原始图像是:
Mat bimage = image> = sliderPos;
然而那个> =对我没有任何意义,并且在bimage / image上使用imshow显示它们是相同的。
有人可以解释一下那里发生了什么吗? 对不起,如果很明显的话。我还不是一个优秀的C ++程序员。
答案 0 :(得分:1)
在这一行:
createTrackbar("threshold", "result", &sliderPos, 255, processImage);
第四个参数(255
)是最大滑块值。最小值始终为0
。因此,sliderPos
将采用[0,255]
范围内的值。
这一行:
Mat bimage = image >= sliderPos;
是一个简单的二值化:bimage
是一个二进制图像,如果image
中的对应值是>=
而不是sliderPos
,则每个像素的值为255,否则为0。
它与:
Mat bimage;
threshold(image, bimage, sliderPos-1, 255, THRESH_BINARY);
bimage
和image
不同。 bimage
只有0
或255
个值,而image
可以包含[0,255]
范围内的任何值。
答案 1 :(得分:1)
如documentation中所述,它是二值化(0或255):
比较:一个cmpop B,一个cmpop alpha,alpha cmpop A,其中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
。
最后,Mat bimage
的{{3}}被称为:
Mat& cv::Mat::operator= (const MatExpr & expr)
将Mat bimage
设置为生成的MatExpr
对象的值。