使用 convertTo 从 CV_16SC1 转换为 CV_32FC1 [关闭]

Posted

技术标签:

【中文标题】使用 convertTo 从 CV_16SC1 转换为 CV_32FC1 [关闭]【英文标题】:Converting from CV_16SC1 to CV_32FC1 using convertTo [closed] 【发布时间】:2016-03-28 22:02:34 【问题描述】:

我正在尝试从 CV_16SC1 转换为 CV_32SC1

我的代码很简单:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

#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

看你的sn-p,我什至不确定你是怎么得到这些数字的:

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

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

#define CV_32F  5

【讨论】:

这真的很奇怪。我重新运行只是为了确保确实得到 16 和 21。也许是 opencv 的版本?我正在使用 2.4.11 好的,我知道问题出在哪里了,我一开始以为我有 3 个频道,但你不能从 3 个频道转到 1 个频道 我也用 2.4.11 做到了这一点。我明白了,这是有道理的。所以你实际上是从CV_8UC3CV_32FC3,对吧? 是的。我弄错了我的初始数据类型

以上是关于使用 convertTo 从 CV_16SC1 转换为 CV_32FC1 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将图像从 CV_64F 转换为 CV_8U

OpenCV——图像的深度与通道数讲解

opencv convertTo 不工作

访问opencv矩阵CV_32S元素

如何正确将 cv::Mat 转换为 CV_8UC1?

如何在opencv中将图像从CV_8UC1转换为CV_32FC1类型?