【问题标题】:OpenCV: Multiply Matrix by Constant in range (0,1). How is data handled?OpenCV:将矩阵乘以范围(0,1)内的常数。数据如何处理?
【发布时间】:2012-01-30 17:29:00
【问题描述】:

如果我有一个矩阵

cv::Mat M;

乘以一个常数

双c;

使用

结果=c*A;

其中 c 介于 0 和 1 之间

如何处理数据?我知道数据是uchar。如果像素值为 26 且 c=0.2,结果会是 截断(26*0.2)=5?

提前非常感谢, 彼得。

【问题讨论】:

    标签: opencv matrix floating-point char constants


    【解决方案1】:

    1.) 数据不一定是 uchar 类型。
    2.) 是的。您可以自己查看

    cv::Mat m = cv::Mat::ones(3 , 1, cv::DataType<unsigned char>::type);
    double c = 0.2;
    m.at<unsigned char>(0 , 0) = 26;
    m.at<unsigned char>(1 , 0) = 27;
    m.at<unsigned char>(1 , 0) = 28;
    cv::Mat res = c * m;
    cout << "res = "<< endl << " "  << res << endl << endl;
    

    【讨论】:

      【解决方案2】:

      根据OpenCVdocs,数据被转换为double,对其执行所需的操作,然后转换为目标类型:

      dst = (dst_type)((double)src*a+b);
      

      其中 a 和 b 是双常量

      【讨论】:

        【解决方案3】:

        在 cvDiv 的 cmets 中,我发现以下内容:

        /* element-wise division/inversion with scaling:
            dst(idx) = src1(idx) * scale / src2(idx)
            or dst(idx) = scale / src2(idx) if src1 == 0 */
        CVAPI(void)  cvDiv( const CvArr* src1, const CvArr* src2,
                            CvArr* dst, double scale CV_DEFAULT(1));
        

        或许您可以使用“scale”参数作为常数,并将 src1 指定为 0。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-19
          • 2020-07-22
          • 1970-01-01
          • 2019-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多