当前位置: 首页 > 知识库问答 >
问题:

获取OpenCV mat并转换为12bit值的数组。

澹台俊晖
2023-03-14
cv::Mat new_matrix(/*type CV_8UC3, size (matrix.rows, matrix.cols/2)*/);
for(int i = 0; i < matrix.rows; ++i){
    for(int j = 0; j < matrix.cols; ++j){
        std::uint16_t upper_half = static_cast<std::uint16_t>(matrix.at<double>(j*2,i));
        std::uint16_t lower_half = static_cast<std::uint16_t>(matrix.at<double>(j*2+1,i));
        std::uint8_t first_byte = static_cast<std::uint8_t>(upper_half>>4);
        std::uint8_t second_byte = static_cast<std::uint8_t>(upper_half<<4) | static_cast<std::uint8_t>(lower_half << 12 >> 12);
        std::uint8_t third_byte = static_cast<std::uint8_t>(lower_half>>4);

        new_matrix.at<cv::Vec3B>(j, i) = cv::Vec3b(first_byte, second_byte, third_byte);
    }
}

注意:在转换之后,我不再打算使用OpenCV中的12bit值,然后我需要提取原始值,并将它们发送到另一个单独的进程

共有1个答案

姜天宇
2023-03-14

CV::MAT将以最小8位为单位存储数据。这意味着您的12位值将在矩阵中任意填充,mat::Elemsize1()的返回值以#字节为单位证明了这一点。对于您需要做的事情,最好的方法似乎是使用一个包含2个值的html" target="_blank">自定义结构(结构大小也是字节填充的),然后将所有内容打包在std::vector<>中。然后,当样本数为奇数时,在流数据上浪费最多12位的填充。

关于打包的一个注意事项:如果您使用类似下面的东西,如果您需要将字节从一个体系结构传输到另一个体系结构,则需要根据机器的不同,颠倒位大小元素的顺序。

#pragma pack(push, 1)
struct PackedSamples { 
    char lowA; 
    char highA : 4; // NOTE: the declaration of bit sized fields order is inverse when
    char lowB : 4; // going from BIG_ENDIAN to SMALL_ENDIAN and vice-versa
    char highB;  
};

#pragma pack(pop)

这里是我用来测试字母顺序的宏,我假设Windows运行在x86/x64上。AMD为__BIG_ENDIAN。

#ifdef WIN32
# ifndef __BYTE_ORDER
#  define __LITTLE_ENDIAN 1234
#  define __BIG_ENDIAN    4321
#  define __BYTE_ORDER __LITTLE_ENDIAN
# endif
#else
# include <endian.h>
#endif
    #pragma pack(push, 1)
    struct PackedSamples { 
        char lowA; 
    #if __BYTE_ORDER == __LITTLE_ENDIAN
        char highA : 4;
        char lowB : 4; 
    #else
        char lowB : 4; 
        char highA : 4;
    #endif
        char highB;  
    };

    #pragma pack(pop)
 类似资料:
  • 问题内容: 我正在尝试将此跨域JSON的键“ 1”处的值转换为我网站上的js数组。 我尝试使用,但遇到跨域原始错误。我尝试使用AJAX并收到跨域原始错误。 有什么办法可以解决这个问题并使用JSON? 这是我尝试使用: 这是我的AJAX尝试: 如果唯一的方法是在服务器上。如何解析JSON,并将键“ 1”的值转换为Go(Golang)CSV文件中的元素。 问题答案: 喜欢: 由于返回的数据来自您,请稍

  • 我将一个即时转换为LocalDate,下面是我的实现: 但是,我在Junit测试中遇到了异常:java.time.DateTimeException:Year的值无效(有效值-9999999999-99999999):-1000000000 有人能帮忙吗? 谢谢!

  • 问题内容: 我试图在我的数字列中附加一些alphabt来获取记录。但即时通讯收到错误,我尝试了强制转换和转换功能。 例如 这里StandardCost是一个数字字段,但是当我获取记录时遇到错误,请看看。 问题答案: 我认为应该 或者

  • 返回给定16进制字符串的数值表示。 注意,该函数对大数无效,使用utils.toBN来处理大数。 调用: web3.utils.hexToNumber(hex) web3.utils.toDecimal(hex) // ALIAS, deprecated 参数: hexString - String|HEX: 16进制字符串 返回值: Number:10进制数值 示例代码: web3.utils

  • 我根据列生成了一个唯一的值,但我想得到的结果是来自不同列的转换值。下面是代码供您参考: 获取唯一值 预期结果:

  • 我得到这个错误,你能找到我做错了什么。 无法转换“java”类型的值。lang.String“”转换为所需的java类型。时间LocalDate的嵌套异常为java。lang.IllegalStateException:无法转换“java”类型的值。lang.String“to required type”java。时间LocalDate“:未找到匹配的编辑器或转换策略。