我正在尝试在 opencv 中执行 RGB 颜色混合操作。我的图像包含在 MxNx3 Mat 中。我想将它与 3x3 矩阵相乘。在 Matlab 中,我执行以下操作: *将图像从 MxNx3 展平为 MNx3 *将 MNx3 矩阵乘以 3x3 颜色混合矩阵 *重塑回 MxNx3
在 Opencv 中,我想做以下事情:
void RGBMixing::mixColors(Mat &imData, Mat &rgbMixData)
{
float rgbmix[] = {1.4237, -0.12364, -0.30003, -0.65221, 2.1936, -0.54141, -0.38854, -0.47458, 1.8631};
Mat rgbMixMat(3, 3, CV_32F, rgbmix);
// Scale the coefficents
multiply(rgbMixMat, 1, rgbMixMat, 256);
Mat temp = imData.reshape(0, 1);
temp = temp.t();
multiply(temp, rgbMixMat, rgbMixData);
}
这会编译但会产生异常:
OpenCV 错误:输入参数的大小不匹配(该操作既不是“数组运算数组”(其中数组具有相同的大小和相同的通道数),也不是“数组运算标量”,也不是“标量运算数组”)在 arithm_op 文件 C:/slave/WinI nstallerMegaPack/src/opencv/modules/core/src/arithm.cpp 中,第 1253 行终止在抛出 'cv::Exception' 实例后调用
what(): C:/slave/ WinInstallerMegaPack/src/opencv/modules/core/src/arithm.cpp: 1253: error: (-209) 该操作既不是'array op array'(其中数组具有相同的大小和相同的通道数),也不是' array op scalar',也不是函数 arithm_op 中的'scalar op array'此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。
更新1:
这是似乎有效的代码:
void RGBMixing::mixColors(Mat &imData, Mat&rgbMixData)
{
Size tempSize;
uint32_t channels;
float rgbmix[] = {1.4237, -0.12364, -0.30003, -0.65221, 2.1936, -0.54141, -0.38854, -0.47458, 1.8631};
Mat rgbMixMat(3, 3, CV_32F, rgbmix);
Mat flatImage = imData.reshape(1, 3);
tempSize = flatImage.size();
channels = flatImage.channels();
cout << "temp channels: " << channels << " Size: " << tempSize.width << " x " << tempSize.height << endl;
Mat flatFloatImage;
flatImage.convertTo(flatFloatImage, CV_32F);
Mat mixedImage = flatFloatImage.t() * rgbMixMat;
mixedImage = mixedImage.t();
rgbMixData = mixedImage.reshape(3, 1944);
channels = rgbMixData.channels();
tempSize = rgbMixData.size();
cout << "temp channels: " << channels << " Size: " << tempSize.width << " x " << tempSize.height << endl;
}
但是生成的图像是扭曲的。如果我跳过两个矩阵的乘法并分配
mixedImage = flatFloatImage
生成的图像看起来很好(只是没有混合颜色)。所以我一定做错了什么,但我越来越接近了。