opencv C++矩阵操作

int main(){
    cv::Mat src1=(cv::Mat_<float>(2,3)<<1,2,3,4,5,6);
    cv::Mat src2=(cv::Mat_<float>(2,3)<<11,12,13,14,15,16);
    cv::Mat src3=(cv::Mat_<float>(3,2)<<11,12,13,14,15,16);
    cv::Mat res=src1+src2;
    std::cout<<"加法:"<<res<<std::endl;
    std::cout<<std::endl;
    res=src1-src2;
    std::cout<<"减法:"<<res<<std::endl;
    std::cout<<std::endl;
    cv::multiply(src1,src2,res);  // void multiply(InputArray src1, InputArray src2,OutputArray dst, double scale = 1, int dtype = -1);
    std::cout<<"点乘:"<<res<<std::endl;
    std::cout<<std::endl;
    res=src1/src2;
    std::cout<<"点除:"<<res<<std::endl;
    std::cout<<std::endl;
    res=src1*src3;  // 乘法(矩阵相乘)必须是float类型否则会报错。
    std::cout<<"乘法(矩阵相乘):"<<res<<std::endl;
    std::cout<<std::endl;

    cv::Mat res1;
    cv::add(src1,src2,res1);  // add(InputArray src1, InputArray src2, OutputArray dst,InputArray mask = noArray(), int dtype = -1);
    std::cout<<"加法:"<<res1<<std::endl;
    std::cout<<std::endl;
    cv::subtract(src1,src2,res1);  // subtract(InputArray src1, InputArray src2, OutputArray dst,InputArray mask = noArray(), int dtype = -1);
    std::cout<<"减法:"<<res1<<std::endl;
    std::cout<<std::endl;
    res1=src1.mul(src2);  // 数据类型必须相同
    std::cout<<"点乘:"<<res1<<std::endl;
    std::cout<<std::endl;
    gemm(src1,src3,1,NULL,0,res1);  // 乘法(矩阵相乘)必须是float类型否则会报错。
    // gemm(InputArray src1, InputArray src2, double alpha,InputArray src3, double beta, OutputArray dst, int flags = 0);
    // gemm也只能接受CV_32FC1、CV_64FC1、CV_32FC2、CV_64FC2数据类型的Mat.
    std::cout<<"乘法(矩阵相乘):"<<res<<std::endl;
    std::cout<<std::endl;

    cv::Mat mat1=(cv::Mat_<int>(2,3)<<1,4,9,16,25,36);  // 注意:cv::Mat_不能写为cv::Mat
    cv::Mat dest;
    // 幂函数,其幂指数确定不变,而幂底数为自变量;
    // 指数函数却是底数确定不变,而指数为自变量。
    // 幂指函数就是幂底数和幂指数同时都为自变量的函数。
    pow(mat1,2,dest);  // 幂函数
    std::cout<<"幂函数:"<<dest<<std::endl;
    std::cout<<std::endl;

    cv::Vec3b src4(1,2,3);
    cv::Vec3b src5(1,2,3);
    cv::Vec3b dst=src4+src5;
    std::cout<<dst<<std::endl;
    return 0;
}

注意:矩阵乘法只能接受CV_32FC1、CV_64FC1、CV_32FC2、CV_64FC2数据类型的Mat.剩下的会报错。

posted @ 2019-09-09 22:01  hiligei  阅读(1007)  评论(0编辑  收藏  举报