OpenCV错误cvtColor需要1通道图像以及如何修复
OpenCV error-cvtColor require 1-channel image and how to fix it?
我是C++和OpenCV的新手,我目前的项目需要一些从矩阵到灰度图像的转换。在这里,我使用了函数cvtColor,但由于某种原因,它一直崩溃,导致错误:"OpenCV错误:断言失败(scn=3|scn=4(在cv::cvtColo">
这里是我的源代码:
for (int i = 0; i < 2048; i++)
{
for (int j = 0; j < 2048; j++)
{
t[i][j] = abs((L3[i][j] - L_blurred_3[i][j]) / (sqrt(L2_blurred[i][j] - L_blurred_4[i][j])));
}
}
Mat tt(2048, 2048, CV_64F, Scalar(0));
for (int i = 0; i < 2048; i++)
{
for (int j = 0; j < 2048; j++)
{
tt.at<double>(i, j) = t[i][j];
}
}
tt.convertTo(tt, CV_32F);
Mat tgray(2048, 2048, CV_32F, Scalar(0));
cvtColor(tt, tgray, COLOR_BGR2GRAY);
我确实在网站和谷歌上做了一些搜索,我尝试了很多不同的方法,但结果仍然相同,我知道问题是我的矩阵"tt"是一个单通道图像,所以我有两个主要问题:
- 如何修复此断言错误?我需要将tt转换为3或4个频道吗?如何
- 是否有任何其他功能可以对1通道图像执行相同的工作
正如dFionov所写,所有图像都是矩阵。如果您想将一些浮点值可视化为灰度图像,则需要将所有值重新缩放到[0.1]范围。例如,您可以使用minMaxLoc
和convertTo
函数,如下所示:
double minV, maxV;
minMaxLoc(tt, &minV, &maxV);
double alpha = 1. / (maxV - minV);
double beta = -minV * alpha;
Mat gray;
tt.convertTo(gray, CV_32FC1, alpha, beta);
imshow("data", gray);
waitKey();
其他类型的范围为:
- [0.255]用于
unsigned char
- [0..65535]用于
unsigned short
- [0..1]用于
float
和double
根据http://de.mathworks.com/help/images/ref/mat2gray.htmlmatlab mat2gray缩放矩阵中的值以适应范围[0..1](黑色=0,白色=1(。
所以你可以使用
cv::normalize(tt, tgray, 0, 1, cv::NORM_MINMAX);
或一般情况下:
cv::normalize(sourceMat, destinationMat, 0, 1, cv::NORM_MINMAX);
所有图像都是矩阵。您可以使用imshow("Image", tt)
查看cv::Mat
中的结果
排队:
cvtColor(tt, tgray, COLOR_BGR2GRAY);
您试图将具有3或4个平面的矩阵转换为具有1个平面的基质。转换类型由COLOR_BGR2GRAY
常量控制。有关cvtColor()
函数的信息,可以在OpenCV文档中找到
在这种情况下,您不需要转换tt矩阵——它已经是灰度图像了。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- Boost Graph Library,修复节点大小
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 如何修复函数样式强制转换或类型构造的预期"("?
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何修复sfml c++代码编译错误
- Python中的for循环与C++有何不同
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何修复此iFile以将.txt输出到控制台
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- OpenCV错误cvtColor需要1通道图像以及如何修复