fully added color implementation
This commit is contained in:
parent
5029044157
commit
df071457d0
@ -71,10 +71,10 @@ float DestructionPower::defaultDestructionPower(int i)
|
|||||||
//gets next highest valued abstraction layer down from current one (if first, get highest)
|
//gets next highest valued abstraction layer down from current one (if first, get highest)
|
||||||
int DestructionPower::getNextAbstractionLayer(coor newCoordinate, int currentAbstractionLayer)
|
int DestructionPower::getNextAbstractionLayer(coor newCoordinate, int currentAbstractionLayer)
|
||||||
{
|
{
|
||||||
if(++currentAbstractionLayer>=DESTRUCTION_COUNT)
|
//hardcode advance
|
||||||
|
if(currentAbstractionLayer<DESTRUCTION_COUNT)
|
||||||
|
return ++currentAbstractionLayer;
|
||||||
return -1;
|
return -1;
|
||||||
else
|
|
||||||
return currentAbstractionLayer;
|
|
||||||
|
|
||||||
float currentPower = 1;
|
float currentPower = 1;
|
||||||
int nextLayer=-1;
|
int nextLayer=-1;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
//TODO!! increase Destructioncount
|
//TODO!! increase Destructioncount
|
||||||
#define DESTRUCTION_COUNT 3
|
#define DESTRUCTION_COUNT 4
|
||||||
|
|
||||||
#include "DestructionPower_Properties.h"
|
#include "DestructionPower_Properties.h"
|
||||||
#include "../AbstraktionLayer_Base.h"
|
#include "../AbstraktionLayer_Base.h"
|
||||||
|
@ -50,7 +50,7 @@ bool AbstractionLayer_ColorMatching::PreProcessing(coor mySize, const vector<Par
|
|||||||
|
|
||||||
m_constraintMatrix[c][r].m_centerColor.h = tempHue_ext.val[0];
|
m_constraintMatrix[c][r].m_centerColor.h = tempHue_ext.val[0];
|
||||||
m_constraintMatrix[c][r].m_centerColor.s = tempSaturation_ext.val[0];
|
m_constraintMatrix[c][r].m_centerColor.s = tempSaturation_ext.val[0];
|
||||||
m_constraintMatrix[c][r].m_centerColor.v = tempSaturation_ext.val[0];
|
m_constraintMatrix[c][r].m_centerColor.v = tempValue_ext.val[0];
|
||||||
|
|
||||||
//**********************************************************//
|
//**********************************************************//
|
||||||
}
|
}
|
||||||
@ -58,13 +58,11 @@ bool AbstractionLayer_ColorMatching::PreProcessing(coor mySize, const vector<Par
|
|||||||
//**Get color of all parts**//
|
//**Get color of all parts**//
|
||||||
|
|
||||||
const vector<Part *> &ref_partArray = *partArray;
|
const vector<Part *> &ref_partArray = *partArray;
|
||||||
int iterator = 0;
|
for(int count =0;count< mySize.row*mySize.col;count++)// multiplied by 4 for all rotations
|
||||||
|
|
||||||
for(int count =0;count< mySize.row*mySize.col*4;count++)// multiplied by 4 for all rotations
|
|
||||||
{
|
{
|
||||||
Scalar tempHue, tempSaturation, tempValue;
|
Scalar tempHue, tempSaturation, tempValue;
|
||||||
|
|
||||||
if(count%4) {
|
|
||||||
char name[100];
|
char name[100];
|
||||||
|
|
||||||
sprintf(name, PATH, count);
|
sprintf(name, PATH, count);
|
||||||
@ -73,9 +71,43 @@ bool AbstractionLayer_ColorMatching::PreProcessing(coor mySize, const vector<Par
|
|||||||
cerr << "Could not open or find the image" << endl;
|
cerr << "Could not open or find the image" << endl;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Scalar value(255, 255, 255 );
|
||||||
|
copyMakeBorder( Part, Part, 3, 3, 3, 3, BORDER_CONSTANT, value );
|
||||||
|
|
||||||
Mat PartCropped = Part(Rect(Part.size().width / 3, Part.size().height / 3, Part.size().width / 3,
|
Mat PartCropped = Part;//(Rect(Part.size().width / 2, Part.size().height / 2, Part.size().width / 2, Part.size().height / 2));
|
||||||
Part.size().height / 3));
|
Mat gray;
|
||||||
|
|
||||||
|
//Prepare the image for findContours
|
||||||
|
cvtColor(PartCropped, gray, CV_BGR2GRAY);
|
||||||
|
threshold(gray, gray, 250, 255, CV_THRESH_BINARY_INV);
|
||||||
|
|
||||||
|
|
||||||
|
//namedWindow("PartCropped", WINDOW_AUTOSIZE); // Create a window for display.
|
||||||
|
//imshow("PartCropped", gray);
|
||||||
|
//waitKey(0); // Wait for a keystroke in the window
|
||||||
|
|
||||||
|
//Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten
|
||||||
|
std::vector<std::vector<cv::Point> > contours;
|
||||||
|
//cv::Mat contourOutput = gray.clone();
|
||||||
|
cv::findContours( gray.clone(), contours, CV_RETR_LIST , CV_CHAIN_APPROX_SIMPLE );
|
||||||
|
|
||||||
|
//Draw the contours
|
||||||
|
Scalar colors[3];
|
||||||
|
colors[0] = cv::Scalar(255, 0, 0);
|
||||||
|
colors[1] = cv::Scalar(0, 255, 0);
|
||||||
|
colors[2] = cv::Scalar(0, 0, 255);
|
||||||
|
|
||||||
|
double length;
|
||||||
|
int max=0;
|
||||||
|
int maxidx=0;
|
||||||
|
for (size_t idx = 0; idx < contours.size(); idx++) {
|
||||||
|
length=arcLength(contours[idx], true);
|
||||||
|
if(length>max && (contours[idx].max_size()>10)) {
|
||||||
|
max = length;
|
||||||
|
maxidx = idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//cv::drawContours(PartCropped, contours, maxidx, colors[maxidx % 3],3);
|
||||||
|
|
||||||
//namedWindow("PartCropped", WINDOW_AUTOSIZE); // Create a window for display.
|
//namedWindow("PartCropped", WINDOW_AUTOSIZE); // Create a window for display.
|
||||||
//imshow("PartCropped", PartCropped);
|
//imshow("PartCropped", PartCropped);
|
||||||
@ -90,45 +122,86 @@ bool AbstractionLayer_ColorMatching::PreProcessing(coor mySize, const vector<Par
|
|||||||
vector<Mat> hsv_planes;
|
vector<Mat> hsv_planes;
|
||||||
split(HSVPart, hsv_planes);
|
split(HSVPart, hsv_planes);
|
||||||
|
|
||||||
tempHue = mean(hsv_planes[0]);
|
Rect roi = boundingRect(contours[maxidx]);
|
||||||
tempSaturation = mean(hsv_planes[1]);
|
|
||||||
tempValue = mean(hsv_planes[2]);
|
|
||||||
|
|
||||||
//cout << "Hue: " << tempHue.val[0] << endl;
|
Mat resImageMeanRGB = PartCropped.clone();
|
||||||
//cout << "Saturation: " << tempSaturation.val[0] << endl;
|
Scalar mean_RGB = mean(PartCropped(roi), gray(roi));
|
||||||
//cout << "Value: " << tempValue.val[0] << endl;
|
//drawContours( resImageMeanRGB, contours, maxidx, mean_RGB, FILLED );
|
||||||
|
//imshow( "MeanRGB", resImageMeanRGB );
|
||||||
|
|
||||||
|
tempHue = mean(hsv_planes[0](roi), gray(roi));
|
||||||
|
tempSaturation = mean(hsv_planes[1](roi), gray(roi));
|
||||||
|
tempValue = mean(hsv_planes[2](roi), gray(roi));
|
||||||
|
|
||||||
|
/*Mat restempHue = PartCropped.clone();
|
||||||
|
drawContours( restempHue, contours, maxidx, tempHue, FILLED );
|
||||||
|
imshow( "MeanHue", restempHue );
|
||||||
|
Mat restempSaturation = PartCropped.clone();
|
||||||
|
drawContours( restempSaturation, contours, maxidx, tempSaturation, FILLED );
|
||||||
|
imshow( "MeanSat", restempSaturation );
|
||||||
|
Mat restempValue = PartCropped.clone();
|
||||||
|
drawContours( restempValue, contours, maxidx, tempValue, FILLED );
|
||||||
|
imshow( "MeanValue", restempValue );
|
||||||
|
|
||||||
|
cout << "RGB: " << mean_RGB << endl;
|
||||||
|
cout << "Hue: " << tempHue.val[0] << endl;
|
||||||
|
cout << "Saturation: " << tempSaturation.val[0] << endl;
|
||||||
|
cout << "Value: " << tempValue.val[0] << endl;
|
||||||
|
|
||||||
|
imshow("Input Image", PartCropped);
|
||||||
|
cvMoveWindow("Input Image", 0, 0);
|
||||||
|
waitKey(0);*/
|
||||||
|
|
||||||
|
for(int rotate=0;rotate<4;rotate++)
|
||||||
|
{
|
||||||
|
ref_partArray[count*4+rotate]->m_acm.m_centerColor.h = tempHue.val[0];
|
||||||
|
ref_partArray[count*4+rotate]->m_acm.m_centerColor.s = tempSaturation.val[0];
|
||||||
|
ref_partArray[count*4+rotate]->m_acm.m_centerColor.v = tempValue.val[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
ref_partArray[iterator]->m_acm.m_centerColor.h = tempHue.val[0];
|
|
||||||
ref_partArray[iterator]->m_acm.m_centerColor.s = tempSaturation.val[1];
|
|
||||||
ref_partArray[iterator]->m_acm.m_centerColor.v = tempValue.val[2];
|
|
||||||
|
|
||||||
iterator ++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AbstractionLayer_ColorMatching::EvaluateQuality (const coor constraintCoordinate, qualityVector& qVector)
|
bool AbstractionLayer_ColorMatching::EvaluateQuality (const coor constraintCoordinate, qualityVector& qVector)
|
||||||
{
|
{
|
||||||
for(int i = 0;i<qVector.size();i++)
|
for(int i = 0;i<qVector.size();i++)
|
||||||
{
|
{
|
||||||
float value = PlaceOfPartGood(constraintCoordinate, qVector[i].second->m_acm.m_partColor);
|
float value1 = PlaceOfPartGood(constraintCoordinate, qVector[i].second->m_acm.m_centerColor);
|
||||||
qVector[i].first = value;
|
|
||||||
|
|
||||||
|
float value2 = (float)(1-(abs(m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].m_centerColor.s-qVector[i].second->m_acm.m_centerColor.s))/255);
|
||||||
|
float value3 = (float)(1-(abs(m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].m_centerColor.v-qVector[i].second->m_acm.m_centerColor.v))/255);
|
||||||
|
|
||||||
|
|
||||||
|
qVector[i].first = (value1+value2+value3)/3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float AbstractionLayer_ColorMatching::PlaceOfPartGood(coor myCoor, HSV myPart)
|
float AbstractionLayer_ColorMatching::PlaceOfPartGood(coor myCoor, HSV myPart)
|
||||||
{
|
{
|
||||||
//Hue max 360°
|
//Hue max 180°
|
||||||
if(m_constraintMatrix[myCoor.col][myCoor.row].m_partColor.h >= 180)
|
if(m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h >= myPart.h)
|
||||||
{
|
{
|
||||||
return 1-abs((m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h-myPart.h)
|
if((m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h-myPart.h) > 90)
|
||||||
/m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h);
|
{
|
||||||
|
return 1-((myPart.h+180-m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h)
|
||||||
|
/90);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return 1-((m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h-myPart.h)
|
||||||
|
/90);
|
||||||
}
|
}
|
||||||
else if(m_constraintMatrix[myCoor.col][myCoor.row].m_partColor.h < 180)
|
}
|
||||||
|
else if(m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h < myPart.h)
|
||||||
|
{
|
||||||
|
if((myPart.h-m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h) > 90)
|
||||||
|
{
|
||||||
|
return 1-abs((myPart.h-180-m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h)
|
||||||
|
/90);
|
||||||
|
} else
|
||||||
{
|
{
|
||||||
return 1-((myPart.h-m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h)
|
return 1-((myPart.h-m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h)
|
||||||
/(360-m_constraintMatrix[myCoor.col][myCoor.row].m_centerColor.h));
|
/90);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -177,12 +177,6 @@ Mat Puzzle::resultImage( vector<LogEntry>& log){
|
|||||||
char name[100];
|
char name[100];
|
||||||
for (auto it:log)
|
for (auto it:log)
|
||||||
{
|
{
|
||||||
if (it.myCoor.col == 27 && it.myCoor.row == 5)
|
|
||||||
{
|
|
||||||
;
|
|
||||||
// imshow("result",result);
|
|
||||||
// waitKey(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//cout << it.PieceCollector[0].second->GetPartID() << endl;
|
//cout << it.PieceCollector[0].second->GetPartID() << endl;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ void createNextLogElement(vector<LogEntry>& log, Puzzle& puzzleMat)
|
|||||||
{
|
{
|
||||||
log.emplace_back(LogEntry(coor(0, 0)));
|
log.emplace_back(LogEntry(coor(0, 0)));
|
||||||
log.back().myCoor = calculateNextCoor(log, puzzleMat);
|
log.back().myCoor = calculateNextCoor(log, puzzleMat);
|
||||||
// puzzleMat.dp.DestructionOfSurrounding(log.back().myCoor);//calculate dp from surrounding
|
puzzleMat.dp.DestructionOfSurrounding(log.back().myCoor);//calculate dp from surrounding
|
||||||
//get all not set pieces
|
//get all not set pieces
|
||||||
for(auto it:puzzleMat.p_myBox)
|
for(auto it:puzzleMat.p_myBox)
|
||||||
if(!it->set)
|
if(!it->set)
|
||||||
@ -80,17 +80,15 @@ void solve(vector<LogEntry>& log,Puzzle& puzzleMat)
|
|||||||
{
|
{
|
||||||
case 0://pömpel
|
case 0://pömpel
|
||||||
puzzleMat.a1.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
puzzleMat.a1.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
||||||
//puzzleMat.a1.EvaluateQuality(log.back().myCoor, log.back().PieceCollector);
|
|
||||||
break;
|
break;
|
||||||
case 1://SURFFeature
|
case 1://SURFFeature
|
||||||
// return;
|
// return;
|
||||||
puzzleMat.a4.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
puzzleMat.a4.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
||||||
break;
|
break;
|
||||||
case 3://poempelposition
|
case 2://poempelposition
|
||||||
return;
|
|
||||||
puzzleMat.a3.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
puzzleMat.a3.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
||||||
break;
|
break;
|
||||||
case 2://color
|
case 3://color
|
||||||
puzzleMat.acm.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
puzzleMat.acm.EvaluateQuality(log.back().myCoor,log.back().PieceCollector);
|
||||||
break;
|
break;
|
||||||
case -1://random
|
case -1://random
|
||||||
@ -101,7 +99,7 @@ void solve(vector<LogEntry>& log,Puzzle& puzzleMat)
|
|||||||
}
|
}
|
||||||
float worth = capLogElements(log);
|
float worth = capLogElements(log);
|
||||||
cout << "remaining: " << log.back().PieceCollector.size() << endl;
|
cout << "remaining: " << log.back().PieceCollector.size() << endl;
|
||||||
// calculateTrueDestructionPower(log,puzzleMat, worth);
|
calculateTrueDestructionPower(log,puzzleMat, worth);
|
||||||
CalculateNewCombinedQuality(log, log.back().PieceCollector, puzzleMat.combinedQualityVector);
|
CalculateNewCombinedQuality(log, log.back().PieceCollector, puzzleMat.combinedQualityVector);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -123,11 +121,13 @@ void setsolution(vector<LogEntry>& log, Puzzle& puzzleMat)
|
|||||||
puzzleMat.setConstraints(log.back().myCoor,log.back().PieceCollector.begin()->second);
|
puzzleMat.setConstraints(log.back().myCoor,log.back().PieceCollector.begin()->second);
|
||||||
cout << "set:" << log.back().myCoor.col << "," << log.back().myCoor.row << endl;
|
cout << "set:" << log.back().myCoor.col << "," << log.back().myCoor.row << endl;
|
||||||
//cout << "ID: " << log.back().PieceCollector[0].second->GetPartID() << endl;
|
//cout << "ID: " << log.back().PieceCollector[0].second->GetPartID() << endl;
|
||||||
|
if(log.back().myCoor.col>=31 && log.back().myCoor.row==5)
|
||||||
|
puzzleMat.resultImage(log);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool backtrack(vector<LogEntry>& log, Puzzle& puzzleMat)
|
bool backtrack(vector<LogEntry>& log, Puzzle& puzzleMat)
|
||||||
{
|
{
|
||||||
puzzleMat.resultImage(log);
|
|
||||||
cout << "backtrack" << endl;
|
cout << "backtrack" << endl;
|
||||||
if(log.empty())
|
if(log.empty())
|
||||||
{
|
{
|
||||||
@ -165,7 +165,10 @@ bool backtrack(vector<LogEntry>& log, Puzzle& puzzleMat)
|
|||||||
|
|
||||||
log.pop_back();
|
log.pop_back();
|
||||||
if(!backtrack(log,puzzleMat))
|
if(!backtrack(log,puzzleMat))
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +192,7 @@ float capLogElements(vector<LogEntry>& log)
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Till Now only ground structure -> incorrect variable ans vector names
|
// Till Now only ground structure -> incorrect variable ans vector names
|
||||||
double limit = 0.9;
|
double limit = 0.6;
|
||||||
double diff = 0;
|
double diff = 0;
|
||||||
|
|
||||||
int id=0;
|
int id=0;
|
||||||
|
Loading…
Reference in New Issue
Block a user