Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OpenCV中的重塑、Mat类型问题乘以Mat矩阵_C++_Opencv_Image Processing_Matrix_Reshape - Fatal编程技术网

C++ 使用OpenCV中的重塑、Mat类型问题乘以Mat矩阵

C++ 使用OpenCV中的重塑、Mat类型问题乘以Mat矩阵,c++,opencv,image-processing,matrix,reshape,C++,Opencv,Image Processing,Matrix,Reshape,我正在尝试实现RGB-LMS和LMS-RGB的颜色转换,并使用乘法矩阵的重塑,以下是这个问题的答案: 我的ori Mat对象来自一个具有3通道(RGB)的图像,我需要将它们与1通道矩阵(lms)相乘,似乎我对矩阵类型有问题。我已经阅读了和这个问题相关的文章和问题,比如,我相信我已经遵循了说明 这是我的代码:[已更新:转换为平面图像] void test(const Mat &forreshape, Mat &output, Mat &pic, int rows, int

我正在尝试实现RGB-LMS和LMS-RGB的颜色转换,并使用乘法矩阵的重塑,以下是这个问题的答案:

我的ori Mat对象来自一个具有3通道(RGB)的图像,我需要将它们与1通道矩阵(lms)相乘,似乎我对矩阵类型有问题。我已经阅读了和这个问题相关的文章和问题,比如,我相信我已经遵循了说明

这是我的代码:[已更新:转换为平面图像]

void test(const Mat &forreshape, Mat &output, Mat &pic, int rows, int cols)
{
    Mat lms(3, 3, CV_32FC3);
    Mat rgb(3, 3, CV_32FC3);
    Mat intolms(rows, cols, CV_32F);

    lms = (Mat_<float>(3, 3) << 1.4671, 0.1843, 0.0030,
                                3.8671, 27.1554, 3.4557,
                                4.1194, 45.5161 , 17.884 );
    /* switch the order of the matrix according to the BGR order of color on OpenCV */


    Mat transpose = (3, 3, CV_32F, lms).t();  // this will do transpose from matrix lms

    pic     = forreshape.reshape(1, rows*cols);
    Mat flatFloatImage;
    pic.convertTo(flatFloatImage, CV_32F);

    rgb         = flatFloatImag*transpose;
    output      = rgb.reshape(3, cols);
}
错误是:

OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) , 
所以这是类型问题


我试图将所有类型更改为32FC3或32FC1,但似乎不起作用。有什么建议吗?

我认为您需要的是将输入转换为平面图像,然后将它们相乘

float lms [] = {1.4671, 0.1843, 0.0030,
                            3.8671, 27.1554, 3.4557,
                            4.1194, 45.5161 , 17.884};
Mat lmsMat(3, 3, CV_32F, lms );

Mat flatImage = ori.reshape(1, ori.rows * ori.cols);
Mat flatFloatImage;
flatImage.convertTo(flatFloatImage, CV_32F);
Mat mixedImage = flatFloatImage * lmsMat;
Mat output = mixedImage.reshape(3, imData.rows); 
我可能把lms矩阵搞砸了,但我想你会从这里赶上的

也看到

编辑: 失真的问题是,在浮点到8U的转换后出现溢出。这将实现以下目的:

rgb         = flatFloatImage*transpose;
rgb.convertTo(pic, CV_32S);
output      = pic.reshape(3, rows)
输出: ;


我也不确定,但快速谷歌搜索给了我不同的LMS矩阵。另外请注意,opencv以B-G-R格式而不是RGB格式存储颜色,因此请记录更改您的混合mtraixes。

您好,谢谢!我已经更新了我的代码,并看到了您推荐的问题。我想现在我面临着和他一样的问题(图像失真),所以我需要将我的源图像乘以矩阵lms(转换RGB-lms),然后将结果乘以lms的转置矩阵,得到原始RGB(lms-RGB)。这就是为什么我需要使用转置。知道为什么会失真吗?嗨,谢谢!对实际上,从RGB到LMS有几种不同的转换矩阵,我们根据它们来选择参考。就我而言,我指的是。当然,我知道BGR顺序,这就是我切换矩阵行的原因。我可以将我的图像转换为RGB并直接使用矩阵或切换矩阵以匹配BGR顺序。我的代码一定出了问题。。我无法得到我想要的图像,仍在努力找出答案。但我知道你的答案是最好的解决办法。谢谢!!
rgb         = flatFloatImage*transpose;
rgb.convertTo(pic, CV_32S);
output      = pic.reshape(3, rows)