怎么将vector<vector<int>>& xlines和vector<vector<int>>& ylines里存的矩形在unsigned short* labelimg上画出来
时间: 2023-10-22 16:16:51 浏览: 42
可以按照以下步骤实现:
1. 遍历`xlines`和`ylines`中每个矩形的四条边,将其转化为一系列的像素坐标。
2. 遍历每个像素坐标,将其对应的`labelimg`上的像素值设置为矩形的标签值。
下面是示例代码:
```cpp
void drawRectangles(vector<vector<int>>& xlines, vector<vector<int>>& ylines, unsigned short* labelimg, int width, int height, unsigned short label) {
// 遍历 xlines 中每个矩形的四条边
for (auto& lines : xlines) {
for (int i = 0; i < lines.size(); i += 2) {
int x1 = lines[i], y1 = lines[i + 1];
int x2 = lines[(i + 2) % lines.size()], y2 = lines[(i + 3) % lines.size()];
// 将边转化为一系列像素坐标
int dx = abs(x2 - x1), dy = abs(y2 - y1);
int sx = (x1 < x2) ? 1 : -1, sy = (y1 < y2) ? 1 : -1;
int err = dx - dy;
while (true) {
if (x1 >= 0 && x1 < width && y1 >= 0 && y1 < height) {
// 将像素坐标对应的像素值设置为矩形的标签值
labelimg[y1 * width + x1] = label;
}
if (x1 == x2 && y1 == y2) break;
int e2 = 2 * err;
if (e2 > -dy) { err -= dy; x1 += sx; }
if (e2 < dx) { err += dx; y1 += sy; }
}
}
}
// 遍历 ylines 中每个矩形的四条边,同上
for (auto& lines : ylines) {
for (int i = 0; i < lines.size(); i += 2) {
int x1 = lines[i], y1 = lines[i + 1];
int x2 = lines[(i + 2) % lines.size()], y2 = lines[(i + 3) % lines.size()];
int dx = abs(x2 - x1), dy = abs(y2 - y1);
int sx = (x1 < x2) ? 1 : -1, sy = (y1 < y2) ? 1 : -1;
int err = dx - dy;
while (true) {
if (x1 >= 0 && x1 < width && y1 >= 0 && y1 < height) {
labelimg[y1 * width + x1] = label;
}
if (x1 == x2 && y1 == y2) break;
int e2 = 2 * err;
if (e2 > -dy) { err -= dy; x1 += sx; }
if (e2 < dx) { err += dx; y1 += sy; }
}
}
}
}
```
其中,`xlines`和`ylines`分别存储了所有矩形的水平和垂直边线段,`labelimg`是用于绘制标签的图像,`width`和`height`是`labelimg`的宽度和高度,`label`是标签值。这段代码使用了 Bresenham 直线算法将边线段转化为一系列像素坐标,并将对应像素的值设置为标签值。