小编Mat*_*ekk的帖子

opencv从缓冲区读取jpeg图像

我有一个unsigned char*包含jpeg图像数据的缓冲区.我想使用c ++和opencv显示该图像.如果我做:

Mat img(Size(640, 480), CV_8UC3, data);
namedWindow("image", 1);
imShow("image", img);
Run Code Online (Sandbox Code Playgroud)

我得到了一堆嘈杂的像素.

我想这是因为数据是jpeg(带有标题).因为这有效:

Mat imgbuf(Size(640, 480), CV_8UC3, data);
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
Run Code Online (Sandbox Code Playgroud)

但我不能使用imdecode函数,因为它来自highgui.h,它基于GTK 2,在我的项目中我使用GTK 3.

那么,我该如何显示缓冲区数据呢?有没有办法在opencv中解码除imdecode之外的jpeg图像,如果这是问题.我真的不想用Qt重建opencv ...

还有其他建议吗?

(使用Linux)

c++ jpeg opencv image image-processing

21
推荐指数
2
解决办法
3万
查看次数

Gdk pixbuf从内存加载图像

使用GTK + 3.6我想从内存中的缓冲区显示图像,而不是磁盘上的文件.我有一个const char *data图像数据,我正在尝试从它创建一个GTK图像.到目前为止,我已经尝试了两种我认为可行的方法.两者都使用GdkPixbuf,因此需要图像数据guchar* (unsigned char*).

有了这个要求,我必须投射数据:

guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
Run Code Online (Sandbox Code Playgroud)

然后我尝试了以下内容:

  1. 将数据写入GdkPixbufLoader gdk_pixbuf_loader_write.在这里我得到一个错误"Unrecognized image file format"或者如果我用特定类型(jpg)创建加载器我得到一个错误,说它不是JPG文件格式(它是,如下所述).

    编辑:一些代码:

    guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
    int stride = ((1056 * 32 + 31) & ~31)/8;
    GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
    GError *error = NULL;
    
    if(!gdk_pixbuf_loader_write(loader, gudata, data_size, &error)
    { 
        printf("Error:\n%s\n", error->message); 
    }
    
    Run Code Online (Sandbox Code Playgroud)

    编辑03/01/2013:从写入函数中删除了stride参数 - 错误打印.

    开罗表面不起作用.显示黑屏和噪音.

  2. 初始化pixbuf gdk_pixbuf_new_from_data然后图像看起来像电视噪声,这表明数据是错误的(并且已经被转换),或者其他参数是错误的(图像行步幅,但它不是:)).

之后的错误我只是想将数据写入到文件中foo.jpg使用ofstream,是的,我得到一个正常的图像文件.file终端中的命令确认它是一个JPEG图像,并且使用一个简单的代码块我从该foo.jpg创建了一个GdkPixbuf来检查它的行步长值,它匹配我传递给上述函数的值.

图像数据是否因演员表而损坏,如果是,我该如何解决?我得到了图像数据const char*.我看过QtPixmap,它也加载了unsigned char*.

我需要使用单独的库吗?(libjpeg?)我安装了libgtk3-dev.

谢谢!

c++ gtk jpeg image-processing gdkpixbuf

1
推荐指数
1
解决办法
7128
查看次数

标签 统计

c++ ×2

image-processing ×2

jpeg ×2

gdkpixbuf ×1

gtk ×1

image ×1

opencv ×1