有3个形状的图像
如果用直接寻找轮廓,最小矩形,我会得到结果
但事实上,我在 RED 中找出的轮廓 1 和轮廓 2 没有得到正确的宽度和高度。 我想要的应该是这个 实现步骤 - 找到形状的主轴 (PCA)
- 旋转到直立(翘曲)
- boundingRect()(图像轴对齐)
变量名 | 类 型 | 静态 | 数组 | 备 注 | 图 | 多维矩阵类 | | | 灰度化 | 多维矩阵类 | | | dRet | 逻辑型 | | | 轮廓集 | 多维数组点2i类 | | | 计次1 | 整数型 | | | 面积 | 双精度小数型 | | | 位置 | 点2f类 | | | xmin | 整数型 | | | xmax | 整数型 | | | ymin | 整数型 | | | ymax | 整数型 | | | 计次2 | 整数型 | | | 方向 | 双精度小数型 | | | lt | 点2i类 | | | ld | 点2i类 | | | rd | 点2i类 | | | rt | 点2i类 | | |
图 = 视觉_图像解码 ( #图片1, #读图_彩色 )视觉_下采样 (图, 图, , 4 )视觉_下采样 (图, 图, , 4 )视觉_颜色空间转换 (图, 灰度化, #颜色_BGR转GRAY, 0 )视觉_阈值 (灰度化, 灰度化, 150, 255, #阈值_二进制 )视觉_查找轮廓 (灰度化, 轮廓集, , #检测_列表, #逼近_任何, )计次循环首 (轮廓集. 尺寸 (), 计次1 )面积 = 视觉_轮廓面积V (轮廓集, 计次1, 假)如果真 (面积 < 100 或 100000 < 面积 )到循环尾 ()方向 = 获取方向 (轮廓集.取点2i类数组 (计次1), 位置)xmin = 99999 xmax = 0 ymin = 99999 ymax = 0 计次循环首 (轮廓集. 成员尺寸 (计次1 ), 计次2 )轮廓集. 写元素 (计次1, 计次2, 旋转后获取点 (轮廓集. 读元素 (计次1, 计次2 ), 位置, 方向 )) 如果真 (轮廓集. 读元素 (计次1, 计次2 ).左边 < xmin )xmin = 轮廓集. 读元素 (计次1, 计次2 ).左边 如果真 (轮廓集. 读元素 (计次1, 计次2 ).左边 > xmax )xmax = 轮廓集. 读元素 (计次1, 计次2 ).左边 如果真 (轮廓集. 读元素 (计次1, 计次2 ).顶边 < ymin )ymin = 轮廓集. 读元素 (计次1, 计次2 ).顶边 如果真 (轮廓集. 读元素 (计次1, 计次2 ).顶边 > ymax )ymax = 轮廓集. 读元素 (计次1, 计次2 ).顶边 计次循环尾 ()lt. 初始化 (xmin, ymin )ld. 初始化 (xmin, ymax )rd. 初始化 (xmax, ymax )rt. 初始化 (xmax, ymin )视觉_绘制轮廓 (图, 轮廓集, 计次1, 标量 (0, 0, 255 ), 2, 8, , 2147483647, )lt = 旋转后获取点 (lt, 位置, -方向 )ld = 旋转后获取点 (ld, 位置, -方向 )rd = 旋转后获取点 (rd, 位置, -方向 )rt = 旋转后获取点 (rt, 位置, -方向 )视觉_线 (图, lt, ld, 标量 (0, 255, 255 ), 2, 8, 0 )视觉_线 (图, lt, rt, 标量 (0, 255, 255 ), 2, 8, 0 )视觉_线 (图, rd, ld, 标量 (0, 255, 255 ), 2, 8, 0 )视觉_线 (图, rd, rt, 标量 (0, 255, 255 ), 2, 8, 0 )计次循环尾 ()视觉_显示图像 (“小白鼠”, 图 )视觉_等待按键 (0 )调试输出 (“完成”)返回 (0 ) |
旋转后获取点 | 点2i类 | | |
输入点 | 点2i类 | | | | 中心 | 点2f类 | | | | 角度 | 双精度小数型 | | | |
返回点.左边 = (输入点.左边 - 中心.左边 ) × 求余弦 (-1 × 角度 ) (输入点.顶边 - 中心.顶边 ) × 求正弦 (-1 × 角度 ) + 中心.左边 返回点.顶边 = (输入点.左边 - 中心.左边 ) × 求正弦 (-1 × 角度 ) (输入点.顶边 - 中心.顶边 ) × 求余弦 (-1 × 角度 ) + 中心.顶边 返回 (返回点 )变量名 | 类 型 | 静态 | 数组 | 备 注 | 数据_点 | 多维矩阵类 | | | i | 整数型 | | | PCA_分析 | 主成分分析类 | | | 特征向量 | 点2d类 | | 2 | 特征向值 | 双精度小数型 | | 2 |
数据_点 = 矩阵 (取数组成员数 (点 ), 2, #Cv双精度小数型_单通道, )变量循环首 (0, 数据_点. 行数 () - 1, 1, i )数据_点. 置元素 (i, 0, 点 [i + 1 ].左边 )数据_点. 置元素 (i, 1, 点 [i + 1 ].顶边 )变量循环尾 () PCA_分析. 运算 (数据_点, , 0, 0 ) 位置. 初始化 (PCA_分析. 平均 (). 取元素 (0, 0 ), PCA_分析. 平均 (). 取元素 (0, 1 )) 变量循环首 (0, 1, 1, i )特征向量 [i + 1 ]. 初始化 (PCA_分析. 特征向量 (). 取元素 (i, 0 ), PCA_分析. 特征向量 (). 取元素 (i, 1 )) 特征向值 [i + 1 ] = PCA_分析. 特征值 (). 取元素 (i, 0 )变量循环尾 ()返回 (求反正切 (特征向量 [1 ].顶边, 特征向量 [1 ].左边 )) |
求反正切 | 双精度小数型 | | |
x | 双精度小数型 | | | | y | 双精度小数型 | | | | 置入代码 ({ 221, 69, 8, 221, 69, 16, 217, 243, 221, 93, 248 })返回 (ret )
|