mirror of https://github.com/sz3/libcimbar
Update/improve tests.
Use new samples, check outputs (w/ imagehash) instead of logging to tmp + manual verification, add a MakeTempDirectory class to clean up stuff, etc
This commit is contained in:
parent
e4b02d4a85
commit
e0f36cae69
|
@ -3,17 +3,23 @@ cmake_minimum_required(VERSION 3.10)
|
||||||
project ( libcimbar )
|
project ( libcimbar )
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "-DLIBCIMBAR_PROJECT_ROOT=\\\"${libcimbar_SOURCE_DIR}\\\"")
|
set(CMAKE_CXX_FLAGS "-DLIBCIMBAR_PROJECT_ROOT=\\\"${libcimbar_SOURCE_DIR}\\\" -std=c++17")
|
||||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
||||||
set(CMAKE_C_FLAGS "${CFLAGS} -Wall -std=c99 -Os")
|
set(CMAKE_C_FLAGS "${CFLAGS} -Wall -std=c99 -Os")
|
||||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -O2 -fpic -std=c++17")
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -O2 -fpic")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT DEFINED OPENCV_LIBS)
|
if(NOT DEFINED OPENCV_LIBS)
|
||||||
set(OPENCV_LIBS "opencv_core" "opencv_imgcodecs" "opencv_imgproc" "opencv_photo")
|
set(OPENCV_LIBS "opencv_core" "opencv_imgcodecs" "opencv_imgproc" "opencv_photo")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
|
||||||
|
set(CPPFILESYSTEM "stdc++fs")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
set (PROJECTS
|
set (PROJECTS
|
||||||
src/exe/cimbar
|
src/exe/cimbar
|
||||||
src/exe/cimbar_scan
|
src/exe/cimbar_scan
|
||||||
|
|
|
@ -30,5 +30,6 @@ target_link_libraries(extractor_test
|
||||||
extractor
|
extractor
|
||||||
|
|
||||||
${OPENCV_LIBS}
|
${OPENCV_LIBS}
|
||||||
|
${CPPFILESYSTEM}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "unittest.h"
|
#include "unittest.h"
|
||||||
|
|
||||||
#include "Deskewer.h"
|
#include "Deskewer.h"
|
||||||
|
#include "image_hash/average_hash.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -14,8 +14,6 @@ TEST_CASE( "DeskewerTest/testSimple", "[unit]" )
|
||||||
cv::Mat actual = de.deskew(TestCimbar::getSample("4color1.jpg"), corners);
|
cv::Mat actual = de.deskew(TestCimbar::getSample("4color1.jpg"), corners);
|
||||||
assertEquals(cv::Size(1024, 1024), actual.size());
|
assertEquals(cv::Size(1024, 1024), actual.size());
|
||||||
|
|
||||||
// TODO: we'll want to do some verification that the transform worked correctly (perhaps with an imagehash??)
|
assertEquals( 0x434caa959f7e56c7, image_hash::average_hash(actual) );
|
||||||
// but for now, this is fine
|
|
||||||
de.save(actual, "/tmp/foo.png");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,45 @@
|
||||||
#include "unittest.h"
|
#include "unittest.h"
|
||||||
|
|
||||||
#include "Extractor.h"
|
#include "Extractor.h"
|
||||||
|
#include "image_hash/average_hash.h"
|
||||||
|
#include "util/MakeTempDirectory.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
TEST_CASE( "ExtractorTest/testExtract", "[unit]" )
|
TEST_CASE( "ExtractorTest/testExtract", "[unit]" )
|
||||||
{
|
{
|
||||||
Extractor ext;
|
MakeTempDirectory tempdir;
|
||||||
ext.extract(TestCimbar::getSample("4color1.jpg"), "/tmp/testExtract.1.jpg");
|
|
||||||
|
|
||||||
// standard image similarity testing questions apply
|
std::string imgPath = tempdir.path() / "ex.jpg";
|
||||||
|
Extractor ext;
|
||||||
|
ext.extract(TestCimbar::getSample("4color1.jpg"), imgPath);
|
||||||
|
|
||||||
|
cv::Mat out = cv::imread(imgPath);
|
||||||
|
assertEquals( 0x434caab59f7e56c7, image_hash::average_hash(out) );
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "ExtractorTest/testExtractMid", "[unit]" )
|
||||||
|
{
|
||||||
|
MakeTempDirectory tempdir;
|
||||||
|
|
||||||
|
std::string imgPath = tempdir.path() / "ex.jpg";
|
||||||
|
Extractor ext;
|
||||||
|
ext.extract(TestCimbar::getSample("4c-cam-40-f1.jpg"), imgPath);
|
||||||
|
|
||||||
|
cv::Mat out = cv::imread(imgPath);
|
||||||
|
assertEquals( 0xe0d3b5b3f6b07075, image_hash::average_hash(out) );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "ExtractorTest/testExtractUpscale", "[unit]" )
|
TEST_CASE( "ExtractorTest/testExtractUpscale", "[unit]" )
|
||||||
{
|
{
|
||||||
Extractor ext;
|
MakeTempDirectory tempdir;
|
||||||
ext.extract(TestCimbar::getSample("4color-cam-140.jpg"), "/tmp/testExtract.2.jpg");
|
|
||||||
|
|
||||||
// standard image similarity testing questions apply
|
std::string imgPath = tempdir.path() / "exup.jpg";
|
||||||
|
Extractor ext;
|
||||||
|
ext.extract(TestCimbar::getSample("4color-cam-140.jpg"), imgPath);
|
||||||
|
|
||||||
|
cv::Mat out = cv::imread(imgPath);
|
||||||
|
assertEquals( 0x44c7f08cfd8f4c, image_hash::average_hash(out) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,76 +13,75 @@
|
||||||
|
|
||||||
TEST_CASE( "ScannerTest/testPiecemealScan", "[unit]" )
|
TEST_CASE( "ScannerTest/testPiecemealScan", "[unit]" )
|
||||||
{
|
{
|
||||||
cv::Mat img = cv::imread(TestCimbar::getSample("4color-ecc40-fountain.jpg"));
|
cv::Mat img = cv::imread(TestCimbar::getSample("4c-cam-40-f1.jpg"));
|
||||||
Scanner sc(img);
|
Scanner sc(img);
|
||||||
|
|
||||||
std::vector<Anchor> candidates = sc.t1_scan_rows();
|
std::vector<Anchor> candidates = sc.t1_scan_rows();
|
||||||
std::string res = turbo::str::join(candidates);
|
std::string res = turbo::str::join(candidates);
|
||||||
assertStringContains("68+-22,187+-0", res);
|
assertStringContains("51+-26,289+-0", res);
|
||||||
assertStringContains("840+-23,153+-0", res);
|
assertStringContains("992+-27,289+-0", res);
|
||||||
assertStringContains("147+-18,884+-0", res);
|
assertStringContains("85+-24,1190+-0", res);
|
||||||
assertStringContains("809+-19,884+-0", res);
|
assertStringContains("959+-25,1190+-0", res);
|
||||||
|
|
||||||
candidates = sc.t2_scan_columns(candidates);
|
candidates = sc.t2_scan_columns(candidates);
|
||||||
assertStringContains("68+-22,191+-23", turbo::str::join(candidates));
|
assertStringContains("51+-27,286+-28", turbo::str::join(candidates));
|
||||||
assertStringContains("840+-23,156+-25", turbo::str::join(candidates));
|
assertStringContains("993+-27,283+-28", turbo::str::join(candidates));
|
||||||
assertStringContains("147+-18,890+-17", turbo::str::join(candidates));
|
assertStringContains("85+-24,1188+-24", turbo::str::join(candidates));
|
||||||
assertStringContains("809+-19,883+-17", turbo::str::join(candidates));
|
assertStringContains("958+-25,1196+-24", turbo::str::join(candidates));
|
||||||
|
|
||||||
candidates = sc.t3_scan_diagonal(candidates);
|
candidates = sc.t3_scan_diagonal(candidates);
|
||||||
assertStringContains("69+-23,192+-23", turbo::str::join(candidates));
|
assertStringContains("52+-28,287+-28", turbo::str::join(candidates));
|
||||||
assertStringContains("840+-22,156+-22", turbo::str::join(candidates));
|
assertStringContains("993+-27,283+-27", turbo::str::join(candidates));
|
||||||
assertStringContains("147+-17,890+-17", turbo::str::join(candidates));
|
assertStringContains("85+-24,1188+-24", turbo::str::join(candidates));
|
||||||
assertStringContains("810+-18,884+-18", turbo::str::join(candidates));
|
assertStringContains("959+-24,1197+-24", turbo::str::join(candidates));
|
||||||
|
|
||||||
candidates = sc.t4_confirm_scan(candidates);
|
candidates = sc.t4_confirm_scan(candidates);
|
||||||
sc.filter_candidates(candidates);
|
sc.filter_candidates(candidates);
|
||||||
|
|
||||||
// ordered by size
|
// ordered by size
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"840+-23,156+-25 69+-23,192+-24 148+-18,890+-17 809+-19,884+-18",
|
"52+-28,286+-28 992+-27,283+-28 85+-24,1188+-24 959+-25,1196+-24",
|
||||||
turbo::str::join(candidates)
|
turbo::str::join(candidates)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "ScannerTest/testExampleScan", "[unit]" )
|
TEST_CASE( "ScannerTest/testExampleScan", "[unit]" )
|
||||||
{
|
{
|
||||||
cv::Mat img = cv::imread(TestCimbar::getSample("4color-ecc40-fountain.jpg"));
|
cv::Mat img = cv::imread(TestCimbar::getSample("4c-cam-40-f1.jpg"));
|
||||||
Scanner sc(img);
|
Scanner sc(img);
|
||||||
|
|
||||||
std::vector<Anchor> candidates = sc.scan();
|
std::vector<Anchor> candidates = sc.scan();
|
||||||
// order is top-left, top-right, bottom-left, bottom-right
|
// order is top-left, top-right, bottom-left, bottom-right
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"69+-23,192+-24 "
|
"52+-28,286+-28 "
|
||||||
"840+-23,156+-25 "
|
"992+-27,283+-28 "
|
||||||
"148+-18,890+-17 "
|
"85+-24,1188+-24 "
|
||||||
"809+-19,884+-18",
|
"959+-25,1196+-24",
|
||||||
turbo::str::join(candidates)
|
turbo::str::join(candidates)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "ScannerTest/testScanEdges", "[unit]" )
|
TEST_CASE( "ScannerTest/testScanEdges", "[unit]" )
|
||||||
{
|
{
|
||||||
cv::Mat img = cv::imread(TestCimbar::getSample("4color-ecc40-fountain.jpg"));
|
cv::Mat img = cv::imread(TestCimbar::getSample("4c-cam-40-f1.jpg"));
|
||||||
Scanner sc(img);
|
Scanner sc(img);
|
||||||
|
|
||||||
std::vector<Anchor> candidates = sc.scan();
|
std::vector<Anchor> candidates = sc.scan();
|
||||||
// order is top-left, top-right, bottom-left, bottom-right
|
// order is top-left, top-right, bottom-left, bottom-right
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"69+-23,192+-24 "
|
"52+-28,286+-28 "
|
||||||
"840+-23,156+-25 "
|
"992+-27,283+-28 "
|
||||||
"148+-18,890+-17 "
|
"85+-24,1188+-24 "
|
||||||
"809+-19,884+-18",
|
"959+-25,1196+-24",
|
||||||
turbo::str::join(candidates)
|
turbo::str::join(candidates)
|
||||||
);
|
);
|
||||||
|
|
||||||
Corners cs(candidates);
|
Corners cs(candidates);
|
||||||
Midpoints mp;
|
Midpoints mp;
|
||||||
std::vector<point<int>> edges = sc.scan_edges(cs, mp);
|
std::vector<point<int>> edges = sc.scan_edges(cs, mp);
|
||||||
// (444, 152), (846, 548), (472, 906), (91, 569)
|
assertEquals( "518,255 1004,757 519,1219 41,754", turbo::str::join(edges) );
|
||||||
assertEquals( "445,151 847,549 472,906 90,569", turbo::str::join(edges) );
|
|
||||||
|
|
||||||
// check "expected" midpoints as well.
|
// check "expected" midpoints as well.
|
||||||
assertEquals( "446.662,174.366 823.277,548.729 472.746,887.052 111.503,567.53", turbo::str::join(mp.points()) );
|
assertEquals( "518.995,284.51 974.896,756.212 519.402,1191.98 69.0967,753.309", turbo::str::join(mp.points()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
TEST_CASE( "SimpleCameraCalibrationTest/testGetParams", "[unit]" )
|
TEST_CASE( "SimpleCameraCalibrationTest/testGetParams", "[unit]" )
|
||||||
{
|
{
|
||||||
cv::Mat img = cv::imread(TestCimbar::getSample("4color-ecc40-fountain.jpg"));
|
cv::Mat img = cv::imread(TestCimbar::getSample("4c-cam-40-f1.jpg"));
|
||||||
|
|
||||||
|
|
||||||
SimpleCameraCalibration scc;
|
SimpleCameraCalibration scc;
|
||||||
|
@ -23,8 +23,8 @@ TEST_CASE( "SimpleCameraCalibrationTest/testGetParams", "[unit]" )
|
||||||
std::stringstream dis;
|
std::stringstream dis;
|
||||||
dis << dp.distortion;
|
dis << dp.distortion;
|
||||||
|
|
||||||
assertEquals( "[240, 0, 480;\n"
|
assertEquals( "[270, 0, 540;\n"
|
||||||
" 0, 320, 640;\n"
|
" 0, 405, 810;\n"
|
||||||
" 0, 0, 1]", cam.str() );
|
" 0, 0, 1]", cam.str() );
|
||||||
assertEquals( "[-0.002561135546020082, 0, 0, 0]", dis.str() );
|
assertEquals( "[-0.002913485439157776, 0, 0, 0]", dis.str() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
#include "unittest.h"
|
#include "unittest.h"
|
||||||
|
|
||||||
#include "Extractor.h"
|
|
||||||
#include "Undistort.h"
|
#include "Undistort.h"
|
||||||
|
|
||||||
|
#include "Extractor.h"
|
||||||
#include "SimpleCameraCalibration.h"
|
#include "SimpleCameraCalibration.h"
|
||||||
|
#include "image_hash/average_hash.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
TEST_CASE( "UndistortTest/testUndistort", "[unit]" )
|
TEST_CASE( "UndistortTest/testUndistort", "[unit]" )
|
||||||
{
|
{
|
||||||
cv::Mat img = cv::imread(TestCimbar::getSample("4color-ecc40-fountain.jpg"));
|
cv::Mat img = cv::imread(TestCimbar::getSample("4c-cam-40-f1.jpg"));
|
||||||
cv::Mat out;
|
cv::Mat out;
|
||||||
|
|
||||||
Undistort<SimpleCameraCalibration> und;
|
Undistort<SimpleCameraCalibration> und;
|
||||||
assertTrue( und.undistort(img, out) );
|
assertTrue( und.undistort(img, out) );
|
||||||
|
|
||||||
cv::imwrite("/tmp/undistort.png", out);
|
assertEquals( 0xe377e7ec100, image_hash::average_hash(out) );
|
||||||
// standard image similarity testing questions apply
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "UndistortTest/testUndistortAndExtract", "[unit]" )
|
TEST_CASE( "UndistortTest/testUndistortAndExtract", "[unit]" )
|
||||||
{
|
{
|
||||||
cv::Mat img = cv::imread(TestCimbar::getSample("4color-ecc40-fountain.jpg"));
|
cv::Mat img = cv::imread(TestCimbar::getSample("4c-cam-40-f1.jpg"));
|
||||||
cv::Mat out;
|
cv::Mat out;
|
||||||
|
|
||||||
Undistort<SimpleCameraCalibration> und;
|
Undistort<SimpleCameraCalibration> und;
|
||||||
|
@ -31,5 +31,5 @@ TEST_CASE( "UndistortTest/testUndistortAndExtract", "[unit]" )
|
||||||
Extractor ex;
|
Extractor ex;
|
||||||
assertTrue( ex.extract(out, out) );
|
assertTrue( ex.extract(out, out) );
|
||||||
|
|
||||||
cv::imwrite("/tmp/undistort+extract.png", out);
|
assertEquals( 0x40589db2779fb200, image_hash::average_hash(out) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <experimental/filesystem>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class MakeTempDirectory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MakeTempDirectory()
|
||||||
|
{
|
||||||
|
_path = std::tmpnam(nullptr);
|
||||||
|
std::experimental::filesystem::create_directory(_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
~MakeTempDirectory()
|
||||||
|
{
|
||||||
|
std::error_code ec;
|
||||||
|
std::experimental::filesystem::remove_all(_path, ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::experimental::filesystem::path path() const
|
||||||
|
{
|
||||||
|
return _path;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::experimental::filesystem::path _path;
|
||||||
|
};
|
Loading…
Reference in New Issue