for (auto it : m_pts) { for (int nRow = it.y(); nRow < it.y()+4; nRow++) { for (int nCol = it.x(); nCol < it.x()+4; nCol++) { ImgBin.row(nRow).data[nCol] = 255; } } }这个函数将点集遍历,但我只想让我点下的点设为白色,该如何修改
时间: 2024-03-28 22:41:44 浏览: 125
如果你只想让点集中的点设为白色,可以使用以下代码:
```c++
for (auto it : m_pts) {
ImgBin.row(it.y()).data[it.x()] = 255;
}
```
这将只在每个点的位置上将像素设置为白色。如果你想要将每个点周围的 4x4 区域都设置为白色,可以使用以下代码:
```c++
for (auto it : m_pts) {
for (int nRow = it.y(); nRow < it.y()+4; nRow++) {
for (int nCol = it.x(); nCol < it.x()+4; nCol++) {
if (nRow >= 0 && nRow < ImgBin.rows && nCol >= 0 && nCol < ImgBin.cols) {
ImgBin.row(nRow).data[nCol] = 255;
}
}
}
}
```
这将在每个点的周围 4x4 区域内将像素设置为白色。需要注意的是,如果点集中的某个点位于图像边界上,那么周围的某些像素可能不在图像范围内,因此需要添加判断语句来避免访问越界。
相关问题
for (auto it : m_pts) { qDebug() << QStringLiteral("it:") << it ; for (int nRow = 0; nRow < it.x(); nRow++) { qDebug() << QStringLiteral("nRow:") << nRow << QStringLiteral("it.y():") <<it.y() ; for (int nCol = 0; nCol < it.y(); nCol++) { qDebug() << QStringLiteral("nCol:") << nCol << QStringLiteral("it.x():") << it.x(); ImgBin.row(it.y()).data[it.x()] = 255; } } }这段代码有点问题,nRow和nCOl没有意义,该如何修改
根据代码的意图,似乎是想在一个二维图像上将一些像素点设置为白色(255)。但是这段代码实现的方式有些问题,因为在内层循环中,每次都是将同一个像素点设置为白色,而不是将不同的像素点设置为白色。
可以将代码改写为:
```c++
for (auto it : m_pts) {
qDebug() << QStringLiteral("it:") << it;
for (int nRow = 0; nRow < it.x(); nRow++) {
qDebug() << QStringLiteral("nRow:") << nRow << QStringLiteral("it.y():") << it.y();
for (int nCol = 0; nCol < it.y(); nCol++) {
qDebug() << QStringLiteral("nCol:") << nCol << QStringLiteral("it.x():") << it.x();
ImgBin.row(nRow).data[nCol] = 255;
}
}
}
```
这样修改后,每次内层循环都会将不同的像素点设置为白色。
在qgraphicsview中用此函数遍历多个点集for (auto it : m_pts) { /*int rect_x = it.x() - RECT_SIZE/4 ; int rect_y = it.y() - RECT_SIZE /4; cv::Rect rect(rect_x, rect_y, RECT_SIZE, RECT_SIZE); rect = rect & cv::Rect(0, 0, ImgBin.cols, ImgBin.rows); for (int nRow = rect_y - rect.height; nRow < rect_y + rect.height; nRow++) { for (int nCol = rect_x - rect.width; nCol < rect_x + rect.width; nCol++) {*/ ImgBin.row(it.y()).data[it.x()] = 255; }在超出图片的地方会进入断点
根据您提供的代码,可能是由于循环中的 rect 超出了图像的范围,导致在超出图片的地方进入了断点。
您可以在循环前加入判断,确保 rect 不会超出图像的范围。例如:
```cpp
for (auto it : m_pts) {
int rect_x = it.x() - RECT_SIZE / 4;
int rect_y = it.y() - RECT_SIZE / 4;
cv::Rect rect(rect_x, rect_y, RECT_SIZE, RECT_SIZE);
rect = rect & cv::Rect(0, 0, ImgBin.cols, ImgBin.rows);
for (int nRow = rect.y; nRow < rect.y + rect.height; nRow++) {
for (int nCol = rect.x; nCol < rect.x + rect.width; nCol++) {
ImgBin.row(nRow).data[nCol] = 255;
}
}
}
```
这里,使用 `cv::Rect` 的 `&` 运算符来确保 `rect` 不会超出图像的范围。同时,在循环中使用 `rect.x` 和 `rect.y` 作为起始值,确保不会越界。
阅读全文