C++ 使用c++;

C++ 使用c++;,c++,opencv,matrix-multiplication,C++,Opencv,Matrix Multiplication,我想用一个图像乘以它的转置。我的图像大小是nxm。 我这样做 for (int k = 0; k < total_images; k++) { Mat img_tp1 = cv::Mat(imgRows, imgCols, CV_32FC1); Mat img_tp2 = cv::Mat(imgRows, imgRows, CV_32FC1); subtract(img[k], MeanMat, img_tp1); img_tp2 = img_tp

我想用一个图像乘以它的转置。我的图像大小是nxm。 我这样做

    for (int k = 0; k < total_images; k++)
{
    Mat img_tp1 = cv::Mat(imgRows, imgCols, CV_32FC1);
    Mat img_tp2 = cv::Mat(imgRows, imgRows, CV_32FC1);

    subtract(img[k], MeanMat, img_tp1);
    img_tp2 = img_tp1 * img_tp2.t();
    std::ostringstream name;
    name << "sub" << k << ".jpg";
    cv::imwrite(name.str(), img_tp2);
}
我怎么做乘法?事实上,我想计算图像序列的协方差矩阵,所以我需要这个乘法。 谢谢

然后我决定为我的RGB图像实现乘法,我使用以下代码:

        for (int i = 0; i < imgRows; i++)
    {
        for (int j = 0; j < imgRows; j++)
        {
            uchar pix1[3];
            uchar pix2[3];
            uchar pix[3] = { 0, 0, 0 };

            for (int k = 0; k < imgCols; k++)
            {
                img_tp1.at<Vec3b>(i, k) = { pix1[0], pix1[1], pix1[2] };
                img_tp1.at<Vec3b>(j, k) = { pix2[0], pix2[1], pix2[2] };
                CovMat0.at<Vec3b>(i, j) = { pix[0], pix[1], pix[2] };
                pix[0] = (pix1[0] * pix2[0]) + pix[0];
                pix[1] = (pix1[1] * pix2[1]) + pix[1];
                pix[2] = (pix1[2] * pix2[2]) + pix[2];
                CovMat0.at<Vec3b>(i, j) = { pix[0], pix[1], pix[2] };
            }
        }
    }
for(int i=0;i
但是处理它需要很多时间。有没有更好的办法?
(我想将一幅图像乘以转置)

查看提供的评论,这也是一幅单通道图像,我认为这不会产生任何期望的结果,通过将图像乘以转置,你到底想做什么呢?它是RGB图像,因此有3个通道。我想计算图像序列的协方差矩阵。fix
Mat img\u tp2=cv::Mat(imgrowth,imgrowth,cv\u 32FC1)
to
Mat img\u tp2=cv::Mat(imgrowth,imgCols,cv\u 32FC1)
实际上乘法矩阵是nxn矩阵而不是nxm。这就是我用它来定义的原因
        for (int i = 0; i < imgRows; i++)
    {
        for (int j = 0; j < imgRows; j++)
        {
            uchar pix1[3];
            uchar pix2[3];
            uchar pix[3] = { 0, 0, 0 };

            for (int k = 0; k < imgCols; k++)
            {
                img_tp1.at<Vec3b>(i, k) = { pix1[0], pix1[1], pix1[2] };
                img_tp1.at<Vec3b>(j, k) = { pix2[0], pix2[1], pix2[2] };
                CovMat0.at<Vec3b>(i, j) = { pix[0], pix[1], pix[2] };
                pix[0] = (pix1[0] * pix2[0]) + pix[0];
                pix[1] = (pix1[1] * pix2[1]) + pix[1];
                pix[2] = (pix1[2] * pix2[2]) + pix[2];
                CovMat0.at<Vec3b>(i, j) = { pix[0], pix[1], pix[2] };
            }
        }
    }