已知线段端点,如何在OpenCV中构造KeyLine结构?
用已知端点构造OpenCV的KeyLine结构成员
当然可以用已知线段端点构造KeyLine的结构成员,下面直接给你明确的赋值逻辑和完整代码:
先理清几个易混淆成员的含义:
startPointX/startPointY:线段起点的像素坐标,直接对应你给出的其中一个端点endPointX/endPointY:线段终点的像素坐标,对应另一个端点octave:线段所在的图像金字塔层级,若在原始尺寸图像上构造线段,直接设为0(OpenCV图像金字塔默认第0层是原始图)ePointInOctaveX/ePointInOctaveY:终点在对应金字塔层级下的坐标,当octave=0时,和endPointX/endPointY完全一致;若在缩放后的金字塔层构造,才需要按比例计算,这里直接和终点坐标保持相同即可
另外,KeyLine的核心成员(比如angle、length)也能通过端点计算出来,让结构更完整:
cv::Point P1(0, 0); cv::Point P2(10, 10); cv::line_descriptor::KeyLine L; // 赋值起点坐标 L.startPointX = P1.x; L.startPointY = P1.y; // 赋值终点坐标 L.endPointX = P2.x; L.endPointY = P2.y; // 金字塔层级,原始图设为0 L.octave = 0; // 对应层级的终点坐标,octave=0时与endPoint一致 L.ePointInOctaveX = P2.x; L.ePointInOctaveY = P2.y; // 计算线段长度 L.length = cv::norm(P2 - P1); // 计算线段与x轴正方向的夹角(弧度制) double dx = P2.x - P1.x; double dy = P2.y - P1.y; L.angle = atan2(dy, dx); // 可选:分类ID,默认设为0即可 L.class_id = 0;
如果是在非原始尺寸的图像金字塔层构造线段,只需调整octave的值,并按金字塔缩放比例(通常是2^octave)计算ePointInOctaveX/ePointInOctaveY,比如octave=1时,坐标需除以2。
内容的提问来源于stack exchange,提问作者user27665
相关产品推荐
相关产品推荐

