quirc库的使用:
该库的所有功能都通过单个头文件公开,其中应包括:#include <quirc.h>
要解码图像,您需要实例化一个struct quirc对象,这是通过quirc_new函数完成的。以后,当您不再需要解码任何内容时,应使用以下命令释放分配的内存quirc_destroy:
struct quirc *qr;
qr = quirc_new();
if (!qr) {
perror("Failed to allocate memory");
abort();
}
/* ... */
quirc_destroy(qr);
获取解码器对象后,您需要设置将要使用的图像大小,可使用quirc_resize以下方法完成:
if (quirc_resize(qr, 640, 480) < 0) {
perror("Failed to allocate video memory");
abort();
}
quirc_resize并且quirc_new是唯一的库函数,其分配内存。如果您打算处理一系列帧(或视频流),则可能要分配单个解码器并确定其大小,并保留该解码器以处理每个帧。
处理框架分为两个阶段。第一阶段是称为识别的图像识别阶段,该阶段会拍摄灰度图像并搜索QR码。使用quirc_begin和quirc_end,您可以将灰度图像直接送入quirc用于图像处理的缓冲区中:
uint8_t *image;
int w, h;
image = quirc_begin(qr, &w, &h);
/* Fill out the image buffer here.
* image is a pointer to a w*h bytes.
* One byte per pixel, w pixels per line, h lines in the buffer.
*/
quirc_end(qr);
注意,quirc_begin仅返回指向先前分配的缓冲区的指针。缓冲区将包含未初始化的数据。呼叫至后quirc_end,解码器会保存一个可通过quirc_count和查询的QR码列表quirc_extract。
此时,处理的第二阶段发生-解码。这是通过调用来完成的,该调用quirc_decode与解码器对象无关。
int num_codes;
int i;
/* We've previously fed an image to the decoder via
* quirc_begin/quirc_end.
*/
num_codes = quirc_count(qr);
for (i = 0; i < num_codes; i++) {
struct quirc_code code;
struct quirc_data data;
quirc_decode_error_t err;
quirc_extract(qr, i, &code);
/* Decoding stage */
err = quirc_decode(&code, &data);
if (err)
printf("DECODE FAILED: %s\n", quirc_strerror(err));
else
printf("Data: %s\n", data.payload);
}
quirc_code并且quirc_data是扁平结构,使用后无需初始化或释放。
版权所有(C)2010-2012 Daniel Beer < dlbeer@gmail.com >