2015-10-22 35 views
1

我试图找出OpenCV fitEllipse用法的文档化方法。了解OpenCV fitEllipse方法

这里可以找到:http://docs.opencv.org/ref/master/de/dc7/fitellipse_8cpp-example.html

的问题是,它适用于一个阈值到图像的基础上,滑块的位置,但与滑块值,与原始图像的唯一路线是:

Mat bimage = image> = sliderPos;

然而那>>对我来说没有意义,在bimage/image上使用imshow显示它们是平等的。

有人可以解释发生了什么吗? 对不起,如果很明显。我不是一个优秀的C++程序员(还)。

回答

1

documentation描述它是一个二值化(0或255):

比较:甲cmpop B,A cmpopα,αcmpop A,其中cmpop是>,> =,的 一个==,!=,< =,<。比较的结果是一个8位 单通道掩模,其元素被设置为255(如果特定 元件或对元件的满足条件)或0


现在我试图解释更多的技术部分的功能被称为。 继example you gave首先我们应该知道的变量类型:

  • imagebimagecv::Mat
  • sliderPosint类型。

为操作>=功能可以在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以下function叫做:

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

这设定Mat bimage到所得MatExpr对象的值。

+0

这似乎回答。我必须对它进行测试,因为我几乎可以肯定,使用imshow使'bimage'和'image'看起来都一样。 我已经使用阈值或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); 

bimageimage是不同的。 bimage只有0255值,而image可以有[0,255]范围内的任何值。