From 2dc4cd934bdc661d72ef1fc2d05c2ef71f7fb1ff Mon Sep 17 00:00:00 2001 From: lluis Date: Tue, 9 Jun 2015 09:36:14 +0200 Subject: [PATCH 1/3] Fix for Bug 4074. This seems to be just a typo-error, because the Tesseract API can handle correctly with RGB images (double-checked and it works). --- modules/text/src/ocr_tesseract.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/text/src/ocr_tesseract.cpp b/modules/text/src/ocr_tesseract.cpp index 8c1bdee9e..eb61c8bbc 100644 --- a/modules/text/src/ocr_tesseract.cpp +++ b/modules/text/src/ocr_tesseract.cpp @@ -127,7 +127,7 @@ public: int component_level=0) { - CV_Assert( (image.type() == CV_8UC1) || (image.type() == CV_8UC1) ); + CV_Assert( (image.type() == CV_8UC1) || (image.type() == CV_8UC3) ); #ifdef HAVE_TESSERACT From d7410500e002d64856e7423ea66cd0016fffe975 Mon Sep 17 00:00:00 2001 From: Lluis Gomez-Bigorda Date: Tue, 9 Jun 2015 16:24:36 +0200 Subject: [PATCH 2/3] Fix for Bug #3633: do away with "quads [2][3] = 255;" The four lowest bits in each quads[i][j] correspond to the 2x2 binary patterns Q_1, Q_2, Q_3 in the NM paper [1] (see in page 4 at the end of first column). Q_1 and Q_2 have four patterns, while Q_3 has only two. --- modules/text/src/erfilter.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/text/src/erfilter.cpp b/modules/text/src/erfilter.cpp index 3d5388f80..b5f58b76c 100644 --- a/modules/text/src/erfilter.cpp +++ b/modules/text/src/erfilter.cpp @@ -287,7 +287,11 @@ void ERFilterNM::er_tree_extract( InputArray image ) quads[1][3] = (1<<3)|(1<<2)|(1<<1); quads[2][0] = (1<<2)|(1<<1); quads[2][1] = (1<<3)|(1); - quads[2][3] = 255; + // quads[2][2] and quads[2][3] are never used so no need to initialize them. + // The four lowest bits in each quads[i][j] correspond to the 2x2 binary patterns + // Q_1, Q_2, Q_3 in the Neumann and Matas CVPR 2012 paper + // (see in page 4 at the end of first column). + // Q_1 and Q_2 have four patterns, while Q_3 has only two. // masks to know if a pixel is accessible and if it has been already added to some region From f7a5bab78578d4fbe61cbce4c8f1a039a61f5dd1 Mon Sep 17 00:00:00 2001 From: jiaolong_x220 Date: Mon, 1 Jun 2015 12:09:03 +0200 Subject: [PATCH 3/3] added INRIA pedestrian dataset --- .../include/opencv2/datasets/pd_inria.hpp | 96 +++++++++ modules/datasets/samples/pd_inria.cpp | 94 ++++++++ modules/datasets/src/pd_inria.cpp | 203 ++++++++++++++++++ 3 files changed, 393 insertions(+) create mode 100644 modules/datasets/include/opencv2/datasets/pd_inria.hpp create mode 100644 modules/datasets/samples/pd_inria.cpp create mode 100644 modules/datasets/src/pd_inria.cpp diff --git a/modules/datasets/include/opencv2/datasets/pd_inria.hpp b/modules/datasets/include/opencv2/datasets/pd_inria.hpp new file mode 100644 index 000000000..75865787e --- /dev/null +++ b/modules/datasets/include/opencv2/datasets/pd_inria.hpp @@ -0,0 +1,96 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2015, Itseez Inc, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Itseez Inc or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DATASETS_PD_INRIA_HPP +#define OPENCV_DATASETS_PD_INRIA_HPP + +#include +#include + +#include "opencv2/datasets/dataset.hpp" + +#include + +namespace cv +{ +namespace datasets +{ + +//! @addtogroup datasets_pd +//! @{ + +enum sampleType +{ + POS = 0, + NEG = 1 +}; + +struct PD_inriaObj : public Object +{ + // image file name + std::string filename; + + // positive or negative + sampleType sType; + + // image size + int width; + int height; + int depth; + + // bounding boxes + std::vector< Rect > bndboxes; +}; + +class CV_EXPORTS PD_inria : public Dataset +{ +public: + virtual void load(const std::string &path) = 0; + + static Ptr create(); +}; + +//! @} + +} +} + +#endif diff --git a/modules/datasets/samples/pd_inria.cpp b/modules/datasets/samples/pd_inria.cpp new file mode 100644 index 000000000..fb711176a --- /dev/null +++ b/modules/datasets/samples/pd_inria.cpp @@ -0,0 +1,94 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2015, Itseez Inc, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Itseez Inc or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "opencv2/datasets/pd_inria.hpp" +#include + +#include +#include +#include + +using namespace std; +using namespace cv; +using namespace cv::datasets; + +int main(int argc, char *argv[]) +{ + const char *keys = + "{ help h usage ? | | show this message }" + "{ path p |true| path to dataset }"; + CommandLineParser parser(argc, argv, keys); + string path(parser.get("path")); + if (parser.has("help") || path=="true") + { + parser.printMessage(); + return -1; + } + + Ptr dataset = PD_inria::create(); + dataset->load(path); + + cout << "train size: " << (unsigned int)dataset->getTrain().size() << endl; + + PD_inriaObj *example = static_cast(dataset->getTrain()[0].get()); + cout << "first train object: " << endl; + cout << "name: " << example->filename << endl; + + // image size + cout << "image size: " << endl; + cout << " - width: " << example->width << endl; + cout << " - height: " << example->height << endl; + cout << " - depth: " << example->depth << endl; + + // bounding boxes + for (unsigned int i = 0; i < (example->bndboxes).size(); i++) + { + cout << "object " << i << endl; + int x = (example->bndboxes)[i].x; + int y = (example->bndboxes)[i].y; + cout << " - xmin = " << x << endl; + cout << " - ymin = " << y << endl; + cout << " - xmax = " << (example->bndboxes)[i].width + x << endl; + cout << " - ymax = " << (example->bndboxes)[i].height + y<< endl; + } + + return 0; +} diff --git a/modules/datasets/src/pd_inria.cpp b/modules/datasets/src/pd_inria.cpp new file mode 100644 index 000000000..2dd847927 --- /dev/null +++ b/modules/datasets/src/pd_inria.cpp @@ -0,0 +1,203 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2015, Itseez Inc, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Itseez Inc or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "opencv2/datasets/pd_inria.hpp" +#include "opencv2/datasets/util.hpp" + +namespace cv +{ +namespace datasets +{ + +using namespace std; + +class PD_inriaImp : public PD_inria +{ +public: + PD_inriaImp() {} + + virtual ~PD_inriaImp() {} + + virtual void load(const string &path); + +private: + void loadDataset(const string &path, const string nameImageSet, vector< Ptr > &imageSet); + void readTextLines(const string filename, vector< string > &lines); + void parseAnnotation(const string filename, Ptr< PD_inriaObj > &object); +}; + +void PD_inriaImp::load(const string &path) +{ + // Training set + train.push_back(vector< Ptr >()); + loadDataset(path, "Train", train.back()); + + // Testing set + test.push_back(vector< Ptr >()); + loadDataset(path, "Test", test.back()); + + // There is no validation set + validation.push_back(vector< Ptr >()); +} + +void PD_inriaImp::readTextLines(const string filename, vector< string > &lines) +{ + ifstream in(filename.c_str()); + string error_message = ""; + + if (!in.is_open()) + { + error_message = format("Unable to open file: \n%s\n", filename.c_str()); + CV_Error(Error::StsBadArg, error_message); + } + + string currline = ""; + + while (getline(in, currline)) + lines.push_back(currline); +} + +void PD_inriaImp::parseAnnotation(const string filename, Ptr< PD_inriaObj > &object) +{ + string error_message = ""; + + ifstream in(filename.c_str()); + + if (!in.is_open()) + { + error_message = format("Unable to open file: \n%s\n", filename.c_str()); + CV_Error(Error::StsBadArg, error_message); + } + + string imageSizeHeader = "Image size (X x Y x C) : "; + string imageSizeFmt = imageSizeHeader + "%d x %d x %d"; + string objWithGTHeader = "Objects with ground truth : "; + string objWithGTFmt = objWithGTHeader + "%d { \"PASperson\" }"; + string boundBoxHeader = "Bounding box for object "; + string boundBoxFmt = boundBoxHeader + "%*d \"PASperson\" (Xmin, Ymin) - (Xmax, Ymax) : (%d, %d) - (%d, %d)"; + + string line = ""; + + int width = 0; + int height = 0; + int depth = 0; + int xmin, ymin, xmax, ymax; + + int numObjects = 0; + + while (getline(in, line)) + { + if (line[0] == '#' || !line[0]) + continue; + + if (strstr(line.c_str(), imageSizeHeader.c_str())) + { + sscanf(line.c_str(), imageSizeFmt.c_str(), &width, &height, &depth); + object->width = width; + object->height = height; + object->depth = depth; + } + else if (strstr(line.c_str(), objWithGTHeader.c_str())) + { + sscanf(line.c_str(), objWithGTFmt.c_str(), &numObjects); + + if (numObjects <= 0) + break; + } + else if (strstr(line.c_str(), boundBoxHeader.c_str())) + { + sscanf(line.c_str(), boundBoxFmt.c_str(), &xmin, &ymin, &xmax, &ymax); + Rect bndbox; + bndbox.x = xmin; + bndbox.y = ymin; + bndbox.width = xmax - xmin; + bndbox.height = ymax - ymin; + (object->bndboxes).push_back(bndbox); + } + } + + CV_Assert((object->bndboxes).size() == (unsigned int)numObjects); +} + +void PD_inriaImp::loadDataset(const string &path, const string nameImageSet, vector< Ptr > &imageSet) +{ + string listAnn = path + nameImageSet + "/annotations.lst"; + string listPos = path + nameImageSet + "/pos.lst"; + string listNeg = path + nameImageSet + "/neg.lst"; + + vector< string > fsAnn; + vector< string > fsPos; + vector< string > fsNeg; + + // read file names + readTextLines(listAnn, fsAnn); + readTextLines(listPos, fsPos); + readTextLines(listNeg, fsNeg); + + CV_Assert(fsAnn.size() == fsPos.size()); + + for (unsigned int i = 0; i < fsPos.size(); i++) + { + Ptr curr(new PD_inriaObj); + parseAnnotation(path + fsAnn[i], curr); + curr->filename = path + fsPos[i]; + curr->sType = POS; + + imageSet.push_back(curr); + } + + for (unsigned int i = 0; i < fsNeg.size(); i++) + { + Ptr curr(new PD_inriaObj); + curr->filename = path + fsNeg[i]; + curr->sType = NEG; + + imageSet.push_back(curr); + } +} + +Ptr PD_inria::create() +{ + return Ptr(new PD_inriaImp); +} + +} +}