2 回答
TA贡献1784条经验 获得超8个赞
这个想法是使用手臂本身的斑点并在其周围放置一个椭圆。然后,提取其主轴。我很快在Matlab中测试了这个想法——而不是 OpenCV。这是我所做的,您应该能够使用 OpenCV 的等效函数来实现类似的输出。
首先,通过 Otsu 计算输入的阈值。然后对阈值添加一些偏差以找到更好的分割并使用该值对图像进行阈值处理。
在伪代码中:
//the bias value
threshBias = 0.4;
//get the binary threshold via otsu:
thresholdLevel = graythresh( grayInput, “otsu” );
//add bias to the original value
thresholdLevel = thresholdLevel - threshSensitivity * thresholdLevel;
//get the fixed binary image:
thresholdLevel = imbinarize( grayInput, thresholdLevel );
经过小斑点过滤后,这是输出:
现在,获取轮廓/斑点并为每个轮廓拟合一个椭圆。在此处查看 OpenCV 示例:https ://docs.opencv.org/3.4.9/de/d62/tutorial_bounding_rotated_ellipses.html
你最终得到两个椭圆:
我们正在寻找最大的椭圆,即面积最大、长轴和短轴最大的椭圆。我使用每个椭圆的宽度和高度来过滤结果。然后将目标椭圆着色为绿色。最后,我得到了目标椭圆的长轴,这里用黄色着色:
现在,要在OpenCV中实现这些想法,您有以下选择:
用于
fitEllipse查找椭圆。这个函数的返回值是一个RotatedRect对象。这里存储的数据是椭圆的顶点。您可以尝试使用 代替拟合椭圆
minAreaRect,它会找到一个包含一个 blob 的最小区域的旋转矩形。
TA贡献1876条经验 获得超7个赞
您可以使用图像矩来计算旋转角度。使用 opencv矩函数,计算二阶中心矩以构造协方差矩阵,然后获得方向,如Image moment wiki 页面中所示。获得归一化中心矩,并从 opencv 。然后方向计算为nu20nu11nu02moments
0.5 * arctan(2 * nu11/(nu20 - nu02))
有关详细信息,请参阅给定的链接。
您可以使用原始图像本身或预处理的图像来计算方向。看看哪一个可以为您提供更好的准确性并使用它。
至于边界框,一旦旋转图像,假设您使用了预处理的图像,获取旋转图像的所有非零像素坐标并使用 opencv boundingRect计算它们的垂直边界框。
添加回答
举报

