使用 convertTo 从 CV_16SC1 转换为 CV_32FC1

Converting from CV_16SC1 to CV_32FC1 using convertTo

我正在尝试从 CV_16SC1 转换为 CV_32SC1

我的代码很简单:

//print value of data.type() = 16
data.convertTo(data, CV_32FC1); 
//print new value of data.type() = 21

没有发生转换是否有原因?也许由于某种原因,无法在这两种类型之间进行转换?

因为根据这个post:Getting enum names (e.g. CV_32FC1) of OpenCV image types?

我的结果是 CV_32SC1,这是非常不受欢迎的,因为我试图在我的矩阵上执行矩阵乘法,这就是我希望它具有浮点类型的原因。

我没有看到任何转换不工作的证据(也没有任何不应该的原因)。

#include <opencv2/opencv.hpp>
#include <iostream>


int main()
{
    cv::Mat data = cv::Mat::ones(2, 2, CV_16SC1);
    std::cout << "Initial data=" << data << "\n";
    std::cout << "Initial type= " << data.type() << "\n";
    std::cout << "Type is CV_16SC1: " << ((data.type() == CV_16SC1) ? "true" : "false") << "\n";

    cv::Mat converted;
    data.convertTo(converted, CV_32FC1);

    std::cout << "Converted" << converted << "\n";
    std::cout << "Converted type=" << converted.type() << "\n";
    std::cout << "Type is CV_32FC1: " << ((converted.type() == CV_32FC1) ? "true" : "false") << "\n";

    return 0;
}

以及来自控制台的文字记录:

Initial data=[1, 1;
  1, 1]
Initial type= 3
Type is CV_16SC1: true
Converted[1, 1;
  1, 1]
Converted type=5
Type is CV_32FC1: true

看着你的代码片段,我什至不确定你是如何得到这些数字的:

  • 16 = 2*8+0 -- 3通道,8位,无符号
  • 21 = 2*8+5 -- 3通道,32位,浮点数

您在解释结果数据类型时犯了一个差一错误:

#define CV_32F  5