123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #include <opencv2/opencv.hpp>
- #include <zbar.h>
- using namespace cv;
- using namespace std;
- using namespace zbar;
- typedef struct
- {
- string type;
- string data;
- vector <Point> location;
- } decodedObject;
- // Find and decode barcodes and QR codes
- void decode(Mat &im, vector<decodedObject>&decodedObjects)
- {
-
- // Create zbar scanner
- ImageScanner scanner;
- // Configure scanner
- scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
-
- // Convert image to grayscale
- Mat imGray;
- cvtColor(im, imGray,COLOR_BGR2GRAY);
- // Wrap image data in a zbar image
- Image image(im.cols, im.rows, "Y800", (uchar *)imGray.data, im.cols * im.rows);
- // Scan the image for barcodes and QRCodes
- int n = scanner.scan(image);
-
- // Print results
- for(Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol)
- {
- decodedObject obj;
-
- obj.type = symbol->get_type_name();
- obj.data = symbol->get_data();
-
- // Print type and data
- cout << "Type : " << obj.type << endl;
- cout << "Data : " << obj.data << endl << endl;
-
- // Obtain location
- for(int i = 0; i< symbol->get_location_size(); i++)
- {
- obj.location.push_back(Point(symbol->get_location_x(i),symbol->get_location_y(i)));
- }
-
- decodedObjects.push_back(obj);
- }
- }
- // Display barcode and QR code location
- void display(Mat &im, vector<decodedObject>&decodedObjects)
- {
- // Loop over all decoded objects
- for(int i = 0; i < decodedObjects.size(); i++)
- {
- vector<Point> points = decodedObjects[i].location;
- vector<Point> hull;
-
- // If the points do not form a quad, find convex hull
- if(points.size() > 4)
- convexHull(points, hull);
- else
- hull = points;
-
- // Number of points in the convex hull
- int n = hull.size();
-
- for(int j = 0; j < n; j++)
- {
- line(im, hull[j], hull[ (j+1) % n], Scalar(255,0,0), 3);
- }
-
- }
-
- // Display results
- imshow("Results", im);
- waitKey(0);
-
- }
- int main(int argc, char* argv[])
- {
-
- // Read image
- Mat im = imread("zbar-test.jpg");
-
- // Variable for decoded objects
- vector<decodedObject> decodedObjects;
-
- // Find and decode barcodes and QR codes
- decode(im, decodedObjects);
- // Display location
- display(im, decodedObjects);
-
- return EXIT_SUCCESS;
- }
|