minRect = cv2.minAreaRect(c) # get oriented bounding box box = cv2.boxPoints(minRect) # 旋转的bounding box # 根据旋转bouding box找到窄边的中心, 相当于焊缝2d起点和2d终点 box_dis = np.linalg.norm((box - box[0]), axis=1)
时间: 2024-03-27 14:41:47 浏览: 119
这段代码是在获取当前轮廓的旋转矩形框,并计算该矩形框的边缘距离。其中,cv2.minAreaRect 函数获取当前轮廓的最小外接矩形,该矩形是可旋转的,其包围了当前轮廓的所有点。接着,cv2.boxPoints 函数获取旋转矩形的四个顶点,并将其存储在变量 box 中。最后,使用 np.linalg.norm 函数计算每个顶点与第一个顶点之间的距离,存储在变量 box_dis 中。这些距离将用于确定焊缝的起点和终点。
相关问题
最小外接矩形cv::minAreaRect minRect的最大外接矩形Rect
最小外接矩形cv::minAreaRect返回的是一个旋转矩形(RotatedRect),包含了最小外接矩形的信息,其中包括矩形中心点坐标、宽度、高度、旋转角度等信息。如果要获取最小外接矩形的最大外接矩形,可以使用RotatedRect的boundingRect()函数,将旋转矩形转换为最大外接矩形(Rect)。
cv::Point2f point1[4];minrect.points(point1);写一个函数判断minrect返回的点对应矩形的位置,加上注释
好的,根据你的要求,我写了下面这个函数来判断矩形四个顶点的位置:
```cpp
void checkRectPoints(cv::RotatedRect minrect) {
cv::Point2f point1[4];
minrect.points(point1);
// 判断四个顶点的位置
for (int i = 0; i < 4; i++) {
if (point1[i].x < minrect.center.x && point1[i].y < minrect.center.y) {
std::cout << "顶点" << i << "在矩形左上方" << std::endl;
} else if (point1[i].x > minrect.center.x && point1[i].y < minrect.center.y) {
std::cout << "顶点" << i << "在矩形右上方" << std::endl;
} else if (point1[i].x > minrect.center.x && point1[i].y > minrect.center.y) {
std::cout << "顶点" << i << "在矩形右下方" << std::endl;
} else {
std::cout << "顶点" << i << "在矩形左下方" << std::endl;
}
}
}
```
这个函数首先调用 `minrect.points(point1)` 来获取矩形四个顶点的坐标,然后根据每个顶点的坐标位置关系来判断其对应矩形的位置。如果顶点的 x 坐标和 y 坐标都小于矩形的中心点的坐标,则该顶点在矩形的左上方;如果顶点的 x 坐标大于矩形的中心点的坐标,且 y 坐标小于矩形的中心点的坐标,则该顶点在矩形的右上方;如果顶点的 x 坐标和 y 坐标都大于矩形的中心点的坐标,则该顶点在矩形的右下方;否则该顶点在矩形的左下方。
需要注意的是,这个函数假设矩形存在,如果矩形不存在,则可能会出现访问越界的错误。
阅读全文