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
opencv中用于RGB颜色混合的3D矩阵乘法_Opencv_Matrix - Fatal编程技术网

opencv中用于RGB颜色混合的3D矩阵乘法

opencv中用于RGB颜色混合的3D矩阵乘法,opencv,matrix,Opencv,Matrix,我正在尝试在opencv中执行RGB颜色混合操作。我有一个MxNx3垫中包含的图像。我想用一个3x3矩阵将其乘以。在Matlab中,我执行以下操作: *将图像从MxNx3展平到MNx3 *将MNx3矩阵乘以3x3颜色混合矩阵 *重塑为MxNx3 在Opencv中,我希望执行以下操作: void RGBMixing::mixColors(Mat &imData, Mat &rgbMixData) { float rgbmix[] = {1.4237, -0.12364, -0

我正在尝试在opencv中执行RGB颜色混合操作。我有一个MxNx3垫中包含的图像。我想用一个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错误:输入参数的大小不匹配(操作无效) 都不是“rray op数组”(其中数组具有相同的大小和 相同数量的通道),也不是“阵列运算标量”,也不是“标量运算” array'),在算术运算中,文件C:/slave/WinI nstallerMegaPack/src/opencv/modules/core/src/arithm.cpp,第1253行 在抛出“cv::Exception”实例后终止调用
什么() C:/slave/WinInstallerMegaPack/src/opencv/modules/core/src/arithm.cpp: 1253:错误:(-209)操作既不是“数组操作数组”(其中 阵列具有相同的大小和相同的通道数),或 函数arithm_op中的“array op scalar”或“sca lar 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;
}

生成的图像看起来很好(只是没有颜色混合)。所以我一定是做错了什么,但我已经接近了。

我在这里看到了几件事:

  • 为了缩放系数,OpenCV支持标量乘法,而不是
    乘法(rgbMixMat,1,rgbMixMat,256)
    您应该直接执行
    rgbMixMat=256*rgbMixMat

  • 如果这是您的全部代码,那么您没有正确初始化
    imData
    或为其赋值,因此该行
    Mat temp=imData.reformate(0,1)可能会崩溃

  • 假设
    imData
    是一个MxNx3(3通道Mat),则需要将其重塑为MNx3(1通道)。根据,当您写入
    Mat temp=imData.reformate(0,1)时您的意思是希望通道数保持不变,且行数应为1。相反,它应该是:

    Mat myData=Mat::ones(100100,CV_32FC3);//100x100x3矩阵

    Mat mydatareformated=myData.reformate(1,myData.rows*myData.cols);//10000x3矩阵

  • 为什么要使用转置
    temp=temp.t()

  • 当您写入
    乘法(temp、rgbMixMat、mixData)时,这是。您需要矩阵积,因此只需执行
    mixData=mydatarestraped*rgbMixMat(然后对其进行重塑)

  • 编辑:如果您不使用转置,它会崩溃,因为您使用了
    imData.reformate(1,3)而不是
    imData.reformate(1,imData.rows)

    试一试


    这就是全部密码吗?我没有看到
    imData
    的任何初始化。我更新了它,这段代码是几个类的一部分。感谢您的输入,当您进行重塑时,为什么要执行rows*cols?在文档中,它将此字段列为要重新设置为的行数。如果我不进行转置,我会得到一个运行时异常。以下是我不进行转置时得到的异常:OpenCV错误:gemm中的断言失败(a_size.width==len),文件C:/slave/WinI nstallerMegaPack/src/OpenCV/modules/core/src/matmul.cpp,在抛出'cv::Exception'what():C:/slave/wininstallermagapack/src/opencv/modules/core/src/matmul.cpp的实例后调用第718行terminate:718:错误:(-215)函数gemm中的a_size.width==len此应用程序已请求运行时以异常方式终止它。有关详细信息,请与应用程序的支持团队联系。@user1712316您使用rows*cols是因为您希望从
    rows x cols x 3
    转到
    (rows*cols)x 3
    。这就是当您说“将MxNx3展平到MNx3”时发生的情况。
    mixedImage = flatFloatImage
    
    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, imData.rows*imData.cols);
        Mat flatFloatImage;
        flatImage.convertTo(flatFloatImage, CV_32F);
    
        Mat mixedImage = flatFloatImage * rgbMixMat;
    
        rgbMixData = mixedImage.reshape(3, imData.rows); 
    }