summaryrefslogtreecommitdiffstats
path: root/modules/image/src/img_zbar.cpp
blob: 1c9b41295c2382871ff0b28d4629c31ac907c24a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/******************************************************************************
 *	Copyright (C) 2018	Alejandro Colomar Andrés		      *
 ******************************************************************************/


/******************************************************************************
 ******* headers **************************************************************
 ******************************************************************************/
/* Standard C ----------------------------------------------------------------*/
		/* INT_MAX */
	#include <climits>
		/* snprintf() */
	#include <cstdio>

/* Packages ------------------------------------------------------------------*/
		/* opencv */
	#include <opencv2/opencv.hpp>
		/* zbar */
	#include <zbar.h>

/* Module --------------------------------------------------------------------*/
		/* data & zb_codes */
	#include "img_iface.hpp"

	#include "img_zbar.hpp"


/******************************************************************************
 ******* static functions *****************************************************
 ******************************************************************************/
static	void	img_zb_decode	(class cv::Mat  *imgptr, void *data);


/******************************************************************************
 ******* main *****************************************************************
 ******************************************************************************/
void	img_zb_act	(class cv::Mat  *imgptr, int action, void *data)
{
	switch (action) {
	case IMG_ZB_ACT_DECODE:
		img_zb_decode(imgptr, data);
		break;
	}
}


/******************************************************************************
 ******* static functions *****************************************************
 ******************************************************************************/
static	void	img_zb_decode	(class cv::Mat  *imgptr, void *data)
{
	struct zbar::zbar_image_scanner_s	*scanner;
	struct zbar::zbar_image_s		*image_zb;
	const struct zbar::zbar_symbol_s	*symbol;

	/* Type of code to scan */
	enum zbar::zbar_symbol_type_e	code_type;
	code_type	= ((struct Img_Iface_Data_Decode *)data)->code_type;

	/* create & configure a reader */
	scanner	= zbar::zbar_image_scanner_create();
	zbar::zbar_image_scanner_set_config(scanner, code_type,
						zbar::ZBAR_CFG_ENABLE, 1);

	/* wrap image data */
	image_zb	= zbar::zbar_image_create();
	zbar::zbar_image_set_format(image_zb, *(int*)"GREY");
	zbar::zbar_image_set_size(image_zb, imgptr->cols, imgptr->rows);
	zbar::zbar_image_set_data(image_zb, (void *)(imgptr->data),
					(imgptr->cols * imgptr->rows),
					NULL);

	/* scan the image for barcodes */
	int	i;
	zb_codes.n	= zbar::zbar_scan_image(scanner, image_zb);
	if (zb_codes.n) {
		/* extract results */
		symbol	= zbar::zbar_image_first_symbol(image_zb);
		for (i = 0; i < ZB_CODES_MAX && symbol; i++) {
			/* Write results into array */
			zb_codes.arr[i].type	= zbar::zbar_symbol_get_type(symbol);
			snprintf(zb_codes.arr[i].sym_name, 80, "%s",
					zbar::zbar_get_symbol_name(
							zb_codes.arr[i].type));
			snprintf(zb_codes.arr[i].data, ZBAR_LEN_MAX, "%s",
					zbar::zbar_symbol_get_data(symbol));

			/* Load next symbol */
			symbol	= zbar::zbar_symbol_next(symbol);
		}
	}

	/* clean up */
	zbar::zbar_image_destroy(image_zb);
	zbar::zbar_image_scanner_destroy(scanner);
}


/******************************************************************************
 ******* end of file **********************************************************
 ******************************************************************************/