Skip to content

Commit

Permalink
Some updates to the C++ test binary:
Browse files Browse the repository at this point in the history
 - calls MultiFormatReader directly
 - code cleanup, removing parts of the QR-specific framework
 - associated change to blackboxtest
  • Loading branch information
flyashi committed Jul 14, 2010
1 parent 25c9d98 commit 0ae47e0
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 138 deletions.
2 changes: 1 addition & 1 deletion cpp/blackboxtest.sh
Expand Up @@ -22,7 +22,7 @@ for format in $formats; do
tmp="${pic%JPG}";
txt="${tmp%jpg}txt";
expected=`cat "$txt"`;
actual=`build/zxing . $pic`;
actual=`build/zxing $pic`;
if [ "$expected" == "$actual" ]; then
echo "passed."
passed=$((passed+1));
Expand Down
157 changes: 20 additions & 137 deletions cpp/magick/src/main.cpp
Expand Up @@ -25,9 +25,9 @@
#include <Magick++.h>
#include "MagickBitmapSource.h"
#include <zxing/common/Counted.h>
#include <zxing/qrcode/QRCodeReader.h>
//#include <zxing/qrcode/QRCodeReader.h>
#include <zxing/Binarizer.h>
#include <zxing/oned/MultiFormatUPCEANReader.h>
#include <zxing/MultiFormatReader.h>
#include <zxing/Result.h>
#include <zxing/ReaderException.h>
#include <zxing/common/GlobalHistogramBinarizer.h>
Expand All @@ -37,122 +37,24 @@
#include <zxing/common/IllegalArgumentException.h>
#include <zxing/BinaryBitmap.h>

#include <zxing/qrcode/detector/Detector.h>
#include <zxing/qrcode/detector/QREdgeDetector.h>
#include <zxing/qrcode/decoder/Decoder.h>
//#include <zxing/qrcode/detector/Detector.h>
//#include <zxing/qrcode/detector/QREdgeDetector.h>
//#include <zxing/qrcode/decoder/Decoder.h>

using namespace Magick;
using namespace std;
using namespace zxing;
using namespace zxing::qrcode;
//using namespace zxing::qrcode;

void draw_matrix(Image& image, Ref<BitMatrix> matrix) {
int width = matrix->getWidth();
int height = matrix->getHeight();
// image.modifyImage();
// image.type(TrueColorType);

PixelPacket* pixels = image.getPixels(0, 0, width, height);

PixelPacket* pixel = pixels;
ColorMono color;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
color.mono(!matrix->get(x, y));
*pixel = color;
pixel++;
}
}
image.syncPixels();
}

void save_matrix(Ref<BitMatrix> matrix, string filename, float scale = 1.0) {
Image image(Geometry(matrix->getWidth(), matrix->getHeight()), Color(MaxRGB, MaxRGB, MaxRGB, 0));
int width = matrix->getWidth();
int height = matrix->getHeight();
draw_matrix(image, matrix);
image.scale(Geometry(width*scale, height*scale));
image.write(filename);
}

void save_grid(Ref<BitMatrix> matrix, string filename, Ref<PerspectiveTransform> transform, int dimension) {
Image image(Geometry(matrix->getWidth(), matrix->getHeight()), Color(MaxRGB, MaxRGB, MaxRGB, 0));

draw_matrix(image, matrix);

image.strokeColor(Color(MaxRGB, 0, 0, MaxRGB / 3));
image.fillColor(Color(0, 0, 0, MaxRGB));
image.strokeWidth(1);

for (int i = 0; i <= dimension; i++) {
vector<float> tpoints(4);

tpoints[0] = 0;
tpoints[1] = i;
tpoints[2] = dimension;
tpoints[3] = i;
transform->transformPoints(tpoints);

DrawableLine line1(tpoints[0], tpoints[1], tpoints[2], tpoints[3]);
image.draw(line1);

tpoints[0] = i;
tpoints[1] = 0;
tpoints[2] = i;
tpoints[3] = dimension;
transform->transformPoints(tpoints);

DrawableLine line2(tpoints[0], tpoints[1], tpoints[2], tpoints[3]);
image.draw(line2);
}

image.write(filename);
}

Ref<Result> decode2D(string out_prefix, Ref<BinaryBitmap> image, string& cell_grid, string& cell_transformed) {

Decoder decoder;

QREdgeDetector detector = QREdgeDetector(image->getBlackMatrix());

Ref<DetectorResult> detectorResult(detector.detect());

vector<Ref<ResultPoint> > points(detectorResult->getPoints());

Ref<DecoderResult> decoderResult(decoder.decode(detectorResult->getBits()));

Ref<Result> result(new Result(decoderResult->getText(),
decoderResult->getRawBytes(),
points,
BarcodeFormat_QR_CODE));
return result;

}

Ref<Result> decode1D(string out_prefix, Ref<BinaryBitmap> image, string& cell_grid, string& cell_transformed) {


Ref<Reader> reader(new oned::MultiFormatUPCEANReader);
Ref<Result> result(new Result(*reader->decode(image)));
return result;
Ref<Result> decode(Ref<BinaryBitmap> image) {
Ref<Reader> reader(new MultiFormatReader);
return Ref<Result> (new Result(*reader->decode(image)));
}

//TODO(flyashi): Call MultiFormatReader directly
Ref<Result> decode(string out_prefix, Ref<BinaryBitmap> image, string& cell_grid, string& cell_transformed) {
try {
return decode1D(out_prefix,image,cell_grid,cell_transformed);
} catch (ReaderException re) {
return decode2D(out_prefix,image,cell_grid,cell_transformed);
}
}

int test_image(Image& image, bool localized) {

int test_image(Image& image, string out_prefix, bool localized) {
string cell_mono;
string cell_transformed;
string cell_result;
string cell_grid;
string result_color = "red";
int res = -1;

Ref<BitMatrix> matrix(NULL);
Expand All @@ -168,17 +70,9 @@ int test_image(Image& image, string out_prefix, bool localized) {
binarizer = new GlobalHistogramBinarizer(source);
}

if (out_prefix.size()) {
string monofile = out_prefix + ".mono.png";
matrix = binarizer->getBlackMatrix();
//save_matrix(matrix, monofile);
cell_mono = "<img src=\"" + monofile + "\" />";
}

Ref<BinaryBitmap> binary(new BinaryBitmap(binarizer));
Ref<Result> result(decode(out_prefix, binary, cell_grid, cell_transformed));
Ref<Result> result(decode(binary));
cell_result = result->getText()->getText();
result_color = "green";
res = 0;
} catch (ReaderException e) {
cell_result = "zxing::ReaderException: " + string(e.what());
Expand All @@ -195,33 +89,30 @@ int test_image(Image& image, string out_prefix, bool localized) {
}

cout << cell_result;

return res;
}

int test_image_local(Image& image, string out_prefix) {
return test_image(image, out_prefix, true);
int test_image_local(Image& image) {
return test_image(image, true);
}

int test_image_global(Image& image, string out_prefix) {
return test_image(image, out_prefix, false);
int test_image_global(Image& image) {
return test_image(image, false);
}


int main(int argc, char** argv) {
if (argc <= 2) {
cout << "Usage: " << argv[0] << " [<outfolder> | \"-\"] <filename1> [<filename2> ...]" << endl;
if (argc <= 1) {
cout << "Usage: " << argv[0] << " <filename1> [<filename2> ...]" << endl;
return 1;
}
string outfolder = argv[1];

// int total = argc - 2;
int gonly = 0;
int lonly = 0;
int both = 0;
int neither = 0;

for (int i = 2; i < argc; i++) {
for (int i = 1; i < argc; i++) {
string infilename = argv[i];
// cerr << "Processing: " << infilename << endl;
Image image;
Expand All @@ -232,19 +123,11 @@ int main(int argc, char** argv) {
continue;
}


int gresult = 1;
int lresult = 1;

if (outfolder == string("-")) {
gresult = test_image_global(image, "");
// lresult = test_image_local(image, "");
} else {
replace(infilename.begin(), infilename.end(), '/', '_');
string prefix = string(outfolder) + string("/") + infilename;
gresult = test_image_global(image, prefix + ".g");
// lresult = test_image_local(image, prefix + ".l");
}
gresult = test_image_global(image);
// lresult = test_image_local(image);

gresult = gresult == 0;
// lresult = lresult == 0;
Expand Down

0 comments on commit 0ae47e0

Please sign in to comment.