uchar 转cv::Mat 三通道
时间: 2024-03-21 12:23:37 浏览: 87
可以使用cv::Mat img = cv::imdecode(cv::Mat(1, length, CV_8UC1, data), CV_LOAD_IMAGE_COLOR)来将一维 uchar 数组转换为三通道的 cv::Mat 图像。其中,length 是 uchar 数组的长度,data 是 uchar 数组的指针。
相关问题
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中,并指定所需的填充类型。
希望这可以解决您的问题!如果还有其他疑问,请随时提问。
三通道图像cv::mat怎样从mat.data从B通道跳转到G通道
在OpenCV库中,`cv::Mat` 类型的数据表示的是一个多通道图像,每个通道的数据存储在一个连续的内存区域。如果你想要从B通道(蓝色)数据跳跃到G通道(绿色),你可以使用OpenCV提供的索引来访问。每个通道的宽度通常是固定的,例如对于一个RGB图像,宽度就是单个像素的字节数(通常是3,因为每个通道是一个字节)。假设通道间隔为一个像素占用的空间,那么可以按照以下步骤操作:
```cpp
uchar* data = mat.ptr<uchar>(); // 获取uchar指针,指向整个图像的第一行
// B通道的位置(0-based)
int bPos = channelIndex * width; // channelIndex = 0 (B), width = 1 (单字节通道)
// G通道的位置
int gPos = bPos + channelsPerPixel; // channelsPerPixel = 3 (通常) 或者等于单个像素的字节数
// 跳过B通道并获取G通道的第一个元素
uchar gValue = *(data + gPos);
// 如果你想获取G通道所有元素,只需将gPos递增即可
for (int i = 0; i < height; ++i) {
gValue = *(data + gPos);
// ...处理gValue...
gPos += width;
}
```
这里,`height`是图像的高度,`width`是宽度(单通道像素数),`channelIndex`是你想要跳过的通道的索引(例如0代表B通道,1代表G通道,2代表R通道)。
阅读全文