for (int nRow = 0; nRow < ImgBin.rows; nRow++) { for (int nCol = 0; nCol < ImgBin.cols; nCol++) { ImgBin.row(nRow).data[nCol] = 255; } }如何将这个mat里的坐标转成点集
时间: 2024-03-27 16:38:26 浏览: 56
您可以使用OpenCV中的findNonZero函数来将二值图像转换为点集。示例代码如下:
```
Mat ImgBin; // 假设这是一个二值图像
// 将所有像素点的值设置为255
for (int nRow = 0; nRow < ImgBin.rows; nRow++) {
for (int nCol = 0; nCol < ImgBin.cols; nCol++) {
ImgBin.row(nRow).data[nCol] = 255;
}
}
// 将二值图像转换为点集
vector<Point> points;
findNonZero(ImgBin, points);
```
在上面的代码中,我们使用findNonZero函数将二值图像ImgBin转换为一个点集points。这个点集中包含了ImgBin中所有像素值为非零的像素点的坐标。您可以将这个点集用于您的后续处理。
相关问题
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; } /* }在画出图片边缘1到时候,会进入断点
这段代码的作用是将m_pts中的点在ImgBin图像上标记为白色(像素值为255),从而画出图片的边缘。代码中使用了一个矩形rect来确定需要标记的区域,如果该区域超出了ImgBin图像的边界,则会进行裁剪。注意到在代码中有一段注释掉的双重循环,可能是之前的实现方式,但现在不再使用。至于为什么会进入断点,需要更多的上下文信息才能判断原因。
#include "stdafx.h" #include "mysad.h" Mat mySAD::computeSAD(Mat &L, Mat &R) { Mat Disparity(L.rows,L.cols,CV_8U,Scalar::all(0)); float temp=0; float temp_min = 0; for (int nrow = 1; nrow < L.rows-1; nrow++) { for (int ncol = 1; ncol < L.cols-1; ncol++) { temp_min = 100000; for (int d = 0; (d < this->dsr && ncol+d+1<L.cols-1); d++) { temp = abs( L.at<unsigned char>(nrow - 1, ncol - 1) - R.at<unsigned char>(nrow - 1, ncol + d - 1) + L.at<unsigned char>(nrow - 1, ncol ) - R.at<unsigned char>(nrow - 1, ncol + d ) + L.at<unsigned char>(nrow - 1, ncol + 1) - R.at<unsigned char>(nrow - 1, ncol + d + 1) + L.at<unsigned char>(nrow , ncol - 1) - R.at<unsigned char>(nrow , ncol + d - 1) + L.at<unsigned char>(nrow , ncol ) - R.at<unsigned char>(nrow , ncol + d ) + L.at<unsigned char>(nrow , ncol + 1) - R.at<unsigned char>(nrow , ncol + d + 1) + L.at<unsigned char>(nrow + 1, ncol - 1) - R.at<unsigned char>(nrow + 1, ncol + d - 1) + L.at<unsigned char>(nrow + 1, ncol ) - R.at<unsigned char>(nrow + 1, ncol + d ) + L.at<unsigned char>(nrow + 1, ncol + 1) - R.at<unsigned char>(nrow + 1, ncol + d + 1)); if (temp < temp_min) { temp_min = temp; Disparity.at<unsigned char>(nrow,ncol) = d*16; } } } float rate = (float)(nrow / L.rows); } return Disparity; }
这是 mySAD 类的成员函数 computeSAD 的实现代码。该函数接受两个输入图像 L 和 R,计算它们的 SAD 匹配,并返回一个位于 [0,255] 范围内的灰度图像 Disparity。在该函数中,首先对 Disparity 进行初始化,然后遍历 L 中的每个像素点,对于每个像素点,在 R 中搜索其可能的匹配位置,计算 SAD 值,并找到最小的 SAD 值对应的位移,将其赋值给 Disparity 中对应的像素点。这里使用了一个窗口大小为 3x3 的模板进行计算,共计算了搜索半径 dsr 个位移。最后返回计算得到的 Disparity。
阅读全文