我正在开发一个应用程序,它将从相机设备接收图像并在GTK窗口中显示它们.
相机以不同的帧速率(1-50 fps)提供原始RGB图像(每像素3个字节,无alpha通道,固定大小).
我已经完成了所有硬件工作,现在有了一个回调函数,可以通过摄像头捕获的每个新图像调用它.
在窗口中显示这些图像的最简单但最快的方法是什么?
这是我已经尝试过的:
使用gdk_draw_rgb_image()
一个GTK绘图区:基本工作,但呈现缓慢,在绘制过程重叠和前几帧后的应用程序崩溃,甚至在1分fps的捕获率.
为每个新帧分配一个GdkPixbuf并调用gtk_image_set_from_pixbuf()
一个gtk图像小部件:只显示第一帧,然后我看到窗口没有变化.可能是我的代码中的错误,但不知道这是否足够快.
使用开罗(cairo_set_source_surface()
,然后cairo_paint()
):看起来相当快,但图像看起来条纹,不知道图像格式是否兼容.
目前我正在考虑尝试类似gstreamer的东西并将这些图像视为视频流,但我不确定这对于我的简单机制是否有点过分.
提前感谢任何建议!
我正在char
从这样的微控制器设备中读取类型的缓冲区:
char data_buffer[DATA_LEN];
FILE *aq_dev = fopen(argv[1], "r");
fread(data_buffer, 1, DATA_LEN, aq_dev);
fclose(aq_dev);
Run Code Online (Sandbox Code Playgroud)
在这个缓冲区blob中有无符号的16位整数,每个整数分布在缓冲区中的两个条目上.例如,有
data_buffer[10] = 0x07
data_buffer[11] = 0xc3
Run Code Online (Sandbox Code Playgroud)
我想读出0x07c3
它等于1987年.尽管事实上我原本以为我可以用uint16_t
指针访问缓冲区并直接读取值,但我必须做一些奇怪的bitmasking:
int value = (buffer[10] << 8) + buffer[11];
Run Code Online (Sandbox Code Playgroud)
给出一个超过35000 的错误值,而看似无用的bitmasking就像
int value = ((buffer[10] & 0xff) << 8) + (buffer[11] & 0xff);
Run Code Online (Sandbox Code Playgroud)
返回正确的值.
一个数组的条目如何char
大于一个字节?
根据我的limits.h
(Linux,x86_64),有#define CHAR_BIT 8
.
有人可以告诉我我的代码有什么问题吗?提前致谢!