int h = 4352, w = 4352, cx = 25, cy = 25; uchar *m_pDefectMap = new uchar[h * w]; memset(m_pDefectMap, 0, h * w * sizeof(uchar)); cv::Mat labels, centroids, stats; cv::Mat matDefectMap = cv::Mat(w, h, CV_8UC1, m_pDefectMap); cv::Mat dst, roi; roi = matDefectMap(cv::Rect(cx, cy, w - 2 * cx, h - 2 * cy)); cv::copyMakeBorder(roi, dst, 1, 1, 1, 1, cv::BORDER_DEFAULT); int nLabelNum = cv::connectedComponentsWithStats(dst, labels, stats, centroids, 8, CV_16U); 报错opencv Assertion failed ((unsigned)i0 < (unsigend)size.p[0])
时间: 2024-04-15 12:26:54 浏览: 148
根据您提供的代码,我看到了一些问题。您创建了一个宽度和高度为4352的图像,但是在创建`cv::Mat`对象`matDefectMap`时,您将宽度和高度值颠倒了。这可能导致访问图像时出现错误。
请尝试修改以下代码行:
```cpp
cv::Mat matDefectMap = cv::Mat(h, w, CV_8UC1, m_pDefectMap);
```
将宽度和高度值正确地传递给`cv::Mat`构造函数。
如果问题仍然存在,请确保在调用`connectedComponentsWithStats`函数之前,输入图像的宽度和高度值与实际图像尺寸相匹配。还要检查传递给函数的其他参数是否正确。
请注意,这只是根据您提供的代码做出的初步分析。如果问题仍然存在,请提供更多的代码和错误上下文,以便我能更好地帮助您解决问题。
相关问题
int m_nHeight = 4352, m_nWidth = 4352, m_nCutCols = 25, m_nCutRows = 25; uchar *m_pDefectMap = new uchar[m_nHeight * m_nWidth]; memset(m_pDefectMap, m_nHeight * m_nWidth * sizeof(uchar)); cv::Mat labels, centroids, stats; cv::Mat matDefectMap = cv::Mat(m_nHeight, m_nWidth, CV_8UC1, m_pDefectMap); cv::Mat roi = matDefectMap(cv::Rect(m_nCutCols, m_nCutRows, m_nWidth - 2 * m_nCutCols, m_nHeight - 2 * m_nCutRows)); cv::Mat dst = cv::Mat(cv::Size(roi.cols + 2, roi.rows + 2), CV_8UC1, cv::Scalar(0)); cv::copyMakeBorder(roi, dst, 1, 1, 1, 1, cv::BORDER_REFLECT_101);填充类型无效
根据您提供的代码,我注意到您在使用cv::copyMakeBorder函数时设置了填充类型为cv::BORDER_REFLECT_101,但您认为填充类型无效。
可能的原因是,您传递给cv::copyMakeBorder函数的输入图像roi的数据类型是CV_8UC1,即单通道8位无符号整数图像。然而,根据您的代码,您创建的输出图像dst的数据类型也是CV_8UC1。这意味着您尝试将单通道图像roi复制到单通道图像dst中,因此无论您设置任何填充类型,结果都将是相同的。
要解决这个问题,您可以尝试创建一个多通道图像作为输出图像dst,以便能够正确应用填充类型。例如,您可以使用以下代码创建一个三通道图像:
```cpp
cv::Mat dst = cv::Mat(cv::Size(roi.cols + 2, roi.rows + 2), CV_8UC3, cv::Scalar(0));
```
然后,您可以使用cv::copyMakeBorder函数将单通道图像roi复制到三通道图像dst中,并指定所需的填充类型。
希望这可以解决您的问题!如果还有其他疑问,请随时提问。
在C++中已知 uchar* pPixel = new uchar[m_pdoc->m_OrigImg.cols*m_pdoc->m_OrigImg.rows * 2]; long nW, nH, nB; m_pdoc->GetOrigImg(&nW, &nH, &nB, pPixel); 请问该怎么遍历pPixel的所有像素 在C++中已知 uchar* pPixel = new uchar[m_pdoc->m_OrigImg.cols*m_pdoc->m_OrigImg.rows * 2]; long nW, nH, nB; m_pdoc->GetOrigImg(&nW, &nH, &nB, pPixel); 请问该怎么遍历pPixel的所有像素
你可以使用嵌套的循环来遍历 `pPixel` 的所有像素。假设 `m_pdoc->m_OrigImg.cols` 表示图像的宽度,`m_pdoc->m_OrigImg.rows` 表示图像的高度,每个像素占用 2 字节,可以按照以下方式进行遍历:
```cpp
for (int y = 0; y < m_pdoc->m_OrigImg.rows; y++) {
for (int x = 0; x < m_pdoc->m_OrigImg.cols; x++) {
// 计算当前像素的索引
int index = (y * m_pdoc->m_OrigImg.cols + x) * 2;
// 获取像素值
uchar pixelValue1 = pPixel[index]; // 第一个字节
uchar pixelValue2 = pPixel[index + 1]; // 第二个字节
// 在这里处理像素值
// ...
// 示例:将像素值设置为 0
pPixel[index] = 0;
pPixel[index + 1] = 0;
}
}
```
上述代码中,变量 `x` 和 `y` 分别表示当前像素的横坐标和纵坐标。通过计算当前像素在一维数组 `pPixel` 中的索引,可以访问到每个像素的值。你可以在内部循环中处理每个像素的值,例如修改像素值或者进行其他操作。
阅读全文