blob: f733b32325a8a3ce22ddfab370ae792837c5a67c [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COLORCHECKERTEST_H
#define COLORCHECKERTEST_H
#include <vector>
#include <string>
#include "testingimage.h"
#include "imagetesthandler.h"
class ColorCheckerTest : public ImageTestHandler {
public:
ColorCheckerTest() : ImageTestHandler() {
mImage = NULL;
mSuccess = false;
}
ColorCheckerTest(int debugHeight, int inputWidth) :
ImageTestHandler(debugHeight, inputWidth) {
mImage = NULL;
mSuccess = false;
}
~ColorCheckerTest();
void addTestingImage(TestingImage* inputImage);
void processData();
const std::vector<std::vector<Vec2f> >* getCheckerCenterAdd() const {
std::vector<std::vector<Vec2f> >* returnPositions =
new std::vector<std::vector<Vec2f> >(
4, std::vector<Vec2f>(6, Vec2f(0.f, 0.f)));
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 6; ++j) {
(*returnPositions)[i][j] = (*mMatchPositions[i][j]);
}
}
return (returnPositions);
}
const std::vector<std::vector<float> >* getCheckerRadiusAdd() const {
std::vector<std::vector<float> >* returnRadius=
new std::vector<std::vector<float> >(
4, std::vector<float>(6, 0.f));
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 6; ++j) {
(*returnRadius)[i][j] = mMatchRadius[i][j];
}
}
return (returnRadius);
}
bool getSuccess() const {
return mSuccess;
}
private:
void initializeRefColor();
void edgeDetection();
void computeGradient(unsigned char* layer, float* gradientMap);
void houghLineDetection(bool* edgeMap, float* gradientAbsolute,
float* gradientDirection);
void findCheckerBoards(std::vector<std::vector<int> > linesDir1,
std::vector<std::vector<int> > linesDir2);
Vec2f findCrossing(std::vector<int> line1, std::vector<int> line2);
void findBestMatch(int i1, int i2, int j1, int j2);
bool verifyPointPair(Vec2f pointUpperLeft, Vec2f pointBottomRight,
Vec2f* pointCenter, Vec3i* color);
void verifyColorGrid();
void fillRefColorGrid();
TestingImage* mImage;
std::vector<std::vector< Vec3i* > > mCandidateColors;
std::vector<std::vector< Vec2f* > > mCandidatePositions;
std::vector<std::vector< Vec3i* > > mReferenceColors;
std::vector<std::vector< Vec2f* > > mMatchPositions;
std::vector<std::vector< Vec3f* > > mMatchColors;
std::vector<std::vector< float > > mMatchRadius;
bool mSuccess;
};
#endif