【问题标题】:C++ openCV mat initializationC++ openCV垫初始化
【发布时间】:2020-09-24 18:33:03
【问题描述】:

我对 OpenCV 完全陌生,我正在尝试从两种不同类型的数据中初始化两个 cv::Mat 矩阵。一个是简单的uint16_t 灰度值的单通道数组,第二个应该保存来自uint8_t 值数组的RGB 值,这些值保存RGB 565(每个像素占用2 个uint8_t,所以它基本上是uint16_t 的数组)。我想要一个单香奈尔矩阵和一个三香奈尔矩阵(可能会在某个时候转换为一个香奈儿……但我还没到那里。

function(uint16_t *oneChanell, int oneChanellWidth, int oneChanellHeight, uint8_t *rgb, int rgbWidth, int rgbHeight){
...
    cv::Mat M1 = cv::Mat(oneChanellHeight, oneChanellWidth, CV_16UC1, oneChanell);
    cv::Mat M2 = cv::Mat(rgbHeight, rgbWidth, CV_16UC3, rgb);
...
}

现在,我知道第二次初始化是错误的。所以这是我的问题的一部分,如何最好地将 rgb565values 数组转换为cv::Mat。 然而,据我了解,第一次初始化应该可以工作。当使用cv::imwrite() 进行测试时,第一个只产生正确大小的空白白色图片,后三个相同(正确)图片的部分重叠剪影,但不是 RGB。任何建议将不胜感激。

【问题讨论】:

    标签: c++ opencv opencv-mat


    【解决方案1】:

    使用cv::cvtColor将mat M2从RGB565转换为RGB格式。

    ...
    
    cv::Mat M2 = cv::Mat(rgbHeight, rgbWidth, CV_16UC1, rgb);
    // M2.depth()    = 2 # CV_16U
    // M2.channels() = 1 # single channel with each element having 16 bit
    
    
    
    //convert mat format from bgr565 to rgb
    cv::Mat M2_rgb;
    cv::cvtColor(M2, M2_rgb, COLOR_BGR5652RGB);
    
    ...
    

    【讨论】:

    • 谢谢。我尝试了您的建议,但是在最后一行中,应用程序崩溃了,我收到了 terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(3.4.2) ...opencv3-3.4.2/modules/imgproc/src/color.hpp:253: error: (-215:Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function 'CvtHelper'
    • 你能分享一下你要转换的图片吗?
    • 正如我所说,在转换时,图片只是从 FPGA 读取的 uint16 值数组。我可以分享 OpenCV 认为的图片是什么,或者以不同的格式保存它,也许。到目前为止,我发现调试打印我认为相关的内容是:M2.depth() = 2, M2.channels() = 1 - 为什么是 1,即使我尝试使用 CV_16UC3 而不是 CV_16UC1 进行初始化?
    • edit 正在打印其他内容,抱歉。它应该是,即使使用 CV_16UC1,M2.channels() = 3。这让我有点困惑,我以为数字是 CV_typeUCnumberOfChannels。
    • 你能检查M2矩阵的高度和宽度吗?
    猜你喜欢
    • 2018-09-21
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多