qq_42924784 2022-08-08 10:25 采纳率: 46.2%
浏览 168
已结题

如何将uchar*转cv::Mat

如何在内存中将相机JPG格式的 uchar *数据流转成opencv Mat形式的矩阵

img


代码如图,图像的数据流是如图所定义的结构体,image 的size != height*width,问如何根据结构体的数据将其转换成opencv中的Mat矩阵形式。我每次一转就会报错。

  • 写回答

6条回答 默认 最新

  • 万里鹏程转瞬至 人工智能领域优质创作者 2022-08-08 11:12
    关注
    获得5.00元问题酬金

    从代码上看Image.size只是读取数据是buffer区的大小。你将读取的数据存储到pbuf中,这里应该是存储整个图像的数据,而你给pbuf分配的大小仅为一个buffer的大小,而非height x width x chanel的大小。height x width x chanel应该是远大于你目前分配的pbuf的空间大小,当你进行遍历赋值时根据 height x width计算pbuf的下标,当下标大于Image.size时则报错了,建议规范编码的命名。

    评论 编辑记录
  • De-Chang Wang 2022-08-08 11:14
    关注
    获得3.50元问题酬金

    jpg是经过压缩编码的图像格式,读出来的数据需要经过解码才能恢复图像原始数据,而后才能把原始数据转换为mat格式

    评论
  • 赵4老师 2022-08-08 11:48
    关注
    获得4.00元问题酬金
    
    /** @brief Reads an image from a buffer in memory.
    
    The function imdecode reads an image from the specified buffer in the memory. If the buffer is too short or
    contains invalid data, the function returns an empty matrix ( Mat::data==NULL ).
    
    See cv::imread for the list of supported formats and flags description.
    
    @note In the case of color images, the decoded images will have the channels stored in **B G R** order.
    @param buf Input array or vector of bytes.
    @param flags The same flags as in cv::imread, see cv::ImreadModes.
    */
    CV_EXPORTS_W Mat imdecode( InputArray buf, int flags );
    
    /** @overload
    @param buf
    @param flags
    @param dst The optional output placeholder for the decoded matrix. It can save the image
    reallocations when the function is called repeatedly for images of the same size.
    */
    CV_EXPORTS Mat imdecode( InputArray buf, int flags, Mat* dst);
    
    
    评论
  • 爱晚乏客游 2022-08-08 12:53
    关注
    获得7.00元问题酬金

    你这是啥?读取中文路径图片?不然直接使用imread()读取啊。你这个报错的意思就是长X宽和你的imag.size()的大小不一致,1280X1072>>99051,相当于你的图片指针长度不勾,图片丢失了当然不行了。如果你的图片指针够的话,可以直接使用 Mat img=Mat(Size(w,h),CV_8UC3,image.pbuf),前提是你的image.pbuf得长度要比w*h大才行,这样可以丢掉后面的数据(只能保证不报错,不能保证你的数据丢掉之后图片是否正常)

    img


    而且,你这后缀不对吧?
    而且看你的读取方式,是从本地磁盘读取的,这个和你的结构体关系不是很大,应为你这个结构体相当于是你自己赋值的,而不是别人已经有数据的结构体给你然后你从image.pbuf里面读取的。如果是已经写好的结构体,那么他给的image.height,width和size应该是正确的数据才对,size=height*width,并且h和w就是图片本身你的大小要对应上去,这样可以直接用我上面说的Mat img=Mat(Size(w,h),CV_8UC3,image.pbuf),

    你可以试试这个。之前测试读中文路径和特殊字符图片的时候写的,可以根据图片本身的大小调整,而不像你这么直接写死图片的大小。另外,都使用opencv了,我的建议是直接用cpp的读取方式。

            string img_path_name="中文路径图片.jpg";
            ifstream pFile(img_path_name, ios::binary);
            pFile.seekg(0, pFile.end); //文件指针移到文件尾
            long long LSize = pFile.tellg(); //获取文件长度
            pFile.seekg(0, pFile.beg);       //移动回到文件头
            vector<uchar> pData(LSize);
            char * buffer = (char*)malloc(sizeof(char)*LSize);
            pFile.read(buffer, LSize);      //将文件读取到buffer
            pFile.close();                    //关闭
            memcpy(&pData[0], buffer, sizeof(char)*LSize); //复制
            free(buffer);
            buffer = nullptr;
            Mat img = imdecode(pData, IMREAD_COLOR);  //解码
    
    评论 编辑记录
  • 脚踏南山 2022-08-08 14:20
    关注
    获得3.50元问题酬金

    可以参考一下代码修改

        uchar c[100][100];
        for(int i=0; i<100; i++)
        for(int j=0; j<100; j++)
            c[i][j] = (i<j)?0:255;
                imshow("x", Mat(100, 100, CV_8UC1, (void *)c));
                waitKey();
    
    评论
  • 妈妈做的脆皮鱼 2022-08-08 15:39
    关注
    获得0.50元问题酬金

    其实opencv提供了相关的库可以直接实现将uchar类型转换为opencv的Mat类型。
    cv::Mat TempImage = cv::Mat(imageHeight,imageWidth, CV_8UC4, uchar
    变量);
    cv::cvtColor(TempImage, GrapImg, cv::COLOR_BGRA2BGR);(如果是4通道的还需要转换为三通道)
    其中CV_8UC4这个不同相机可能通道数不一样,需要根据相机返回数据的具体类型更改(我用的索尼的工业相机目前以上是OK的)。 建议去opencv官网查看一下该API参数的说明。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 创建了问题 8月8日

悬赏问题

  • ¥15 为什么我的虚拟机运行配置apache的脚本都会错误,重装也没用
  • ¥15 霍利韦尔软件web station N4的安装密码忘记了能找回吗
  • ¥20 帮电子新生画个仿真图吧🥰
  • ¥20 基于STM32F407设计一个贪食蛇游戏,要求:1有开始 、结束界面,能进行游戏设置,如:界面颜色,蛇移动速度。2蛇体能上下左右移动且在界面能随机生成食物,蛇吃后会变长;3小蛇碰壁死亡,显示游戏结束。
  • ¥15 摁摁钮(接P3.4口)无法实现点阵管播放速度调节,大家能帮我看看是什么问题吗?TAT
  • ¥30 小型网络防火墙mstp.vrrp.ospf配置
  • ¥15 grafna发送告警信息
  • ¥15 51单片机,LCD屏幕内容修改
  • ¥20 Ida Pro动态调试
  • ¥15 TensorFlow深度学习拓展项目