本帖最后由 z13228604287 于 2022-5-17 18:41 编辑
思路步骤:
① 读取图像
② 二值化
③ 根据面积剔除非回形针的region
④ 计算每个region的方向和中心
⑤ 结果输出
转到OpenCV时,主要有几个小问题需要理清:
① 轮廓的方向怎么计算?直线拟合?还是计算轮廓中心和回形针端点来算角度?
② 回形针的端点坐标如何计算?
③ 绘制箭头?
如下是OpenCV实现的部分代码和效果图:
变量名 | 类 型 | 静态 | 数组 | 备 注 | 图片 | 多维矩阵类 | | | 灰度图 | 多维矩阵类 | | | 轮廓 | 多维数组点2i类 | | | 边框矩形 | 矩形2i类 | | 0 | 边框 | 旋转矩形类 | | 0 | 矩形 | 点2f类 | | 4 | i | 整数型 | | | 坐标集 | 点2i类 | | 0 | 最大距离 | 双精度小数型 | | | 矩 | 矩类 | | | 中心点 | 点2i类 | | | 最远点 | 点2i类 | | | j | 整数型 | | | 距离 | 双精度小数型 | | | 角度 | 双精度小数型 | | |
图片 = 视觉_图像解码 ( #图片1, 1 )如果真 (图片. 空 ()) 视觉_控制台输出 (“读取图像错误,请重新检查!”, )视觉_控制台命令 (“pause”)返回 (-1 )视觉_颜色空间转换 (图片, 灰度图, #颜色_BGR转GRAY, 0)视觉_阈值 (灰度图, 灰度图, 85, 255, #阈值_二进制_取反 )视觉_查找轮廓 (灰度图, 轮廓, , #检测_外部, #逼近_任何, )重定义数组 (边框矩形, 假, 轮廓. 尺寸 ()) 重定义数组 (边框, 假, 轮廓. 尺寸 ()) 计次循环首 (轮廓. 尺寸 (), i ) 边框 [i ] = 视觉_最小轮廓矩形 (轮廓. 取点2i类数组 (i )) 如果真 (边框 [i ].宽 < 30 或 边框 [i ].高 < 30 )到循环尾 ()最大距离 = 0矩 = 视觉_计算矩 (轮廓. 取点2i类数组 (i ), , 假)中心点 = 点2i (矩. m10 () ÷ 矩. m00 (), 矩. m01 () ÷ 矩. m00 ()) 坐标集 = 轮廓. 取点2i类数组 (i )计次循环首 (取数组成员数 (坐标集 ), j )距离 = 求平方根 (求次方 (坐标集 [j ].左边 - 中心点.左边, 2 ) + 求次方 (坐标集 [j ].顶边 - 中心点.顶边, 2 )) 如果真 (距离 > 最大距离 )最远点 = 点2i (坐标集 [j ].左边, 坐标集 [j ].顶边 )最大距离 = 距离 计次循环尾 () 视觉_箭头线 (图片, 中心点, 最远点, 标量 (0, 0, 255 ), 2, 8, 0, 0.3 )角度 = 四舍五入 (标线角度 (中心点, 最远点 ), 1 )视觉_放置文本 (图片, 到文本 (角度 ), 中心点, #字体_衬线_简单, 0.8, 标量 (0, 255, 255 ), 2, 8, 假)计次循环尾 ()视觉_显示图像 (“小白鼠”, 图片 )视觉_等待按键 (0 )返回 (0 ) |
标线角度 | 双精度小数型 | | |
点开始 | 点2i类 | | | | 点结束 | 点2i类 | | | | 判断 (点开始.左边 = 点结束.左边 )角度 = 90 判断 (点开始.顶边 = 点结束.顶边 )角度 = 0 角度 = 求反正切 ( (点结束.顶边 - 点开始.顶边 ) ÷ (点结束.左边 - 点开始.左边 )) × 180 ÷ #pi 判断 (角度 < 0 )角度 = 取绝对值 (角度 )如果真 (角度 > 0 )角度 = 180 - 角度 如果真 (点结束.顶边 - 点开始.顶边 > 0 且 点结束.左边 - 点开始.左边 > 0 )角度 = 角度 - 180 返回 (角度)
|