diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 658b4fd..26ef6a8 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -10,7 +10,6 @@ set(SOURCE_FILES functions/solve/structure.cpp functions/AbstractionLayers/AbstraktionLayer_Base.h functions/AbstractionLayers/Layer1/AbstractionLayer_1.cpp - functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.cpp functions/AbstractionLayers/DestructionPower/DestructionPower.cpp header/solve.h header/input.h diff --git a/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.cpp b/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.cpp index eeea3a8..6c76477 100644 --- a/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.cpp +++ b/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.cpp @@ -1,7 +1,3 @@ -// -// Created by mpapa on 05.12.2017. -// - #include "DestructionPower.h" //TODO! Add more layers here! @@ -39,6 +35,8 @@ bool DestructionPower::RemoveConstraintOnPosition(const coor constraintCoordinat //gets destruction power from left and from top if possible and normalizes void DestructionPower::DestructionOfSurrounding(const coor constraintCoordinate) { + for(int i = 0; i < m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray.size(); ++i) + m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray.pop_back(); for (int i = 0; i < DESTRUCTION_COUNT; ++i) { m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray.push_back(0); diff --git a/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.h b/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.h index 4f8b506..8d8eb9f 100644 --- a/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.h +++ b/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.h @@ -1,10 +1,6 @@ -// -// Created by mpapa on 05.12.2017. -// - #pragma once //TODO!! increase Destructioncount -#define DESTRUCTION_COUNT 2 +#define DESTRUCTION_COUNT 1 #include "DestructionPower_Properties.h" #include "../AbstraktionLayer_Base.h" diff --git a/Source/functions/AbstractionLayers/DestructionPower/DestructionPower_Properties.h b/Source/functions/AbstractionLayers/DestructionPower/DestructionPower_Properties.h index d2f294c..33b2d4c 100644 --- a/Source/functions/AbstractionLayers/DestructionPower/DestructionPower_Properties.h +++ b/Source/functions/AbstractionLayers/DestructionPower/DestructionPower_Properties.h @@ -1,6 +1,3 @@ -// -// Created by mpapa on 05.12.2017. -// #pragma once #define DESTRUCTION_INIT 0.5 diff --git a/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.cpp b/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.cpp index 286cc93..65976ea 100644 --- a/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.cpp +++ b/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.cpp @@ -46,6 +46,8 @@ bool AbstractionLayer_1::PreProcessing(coor mySize, const vector* partAr //it through qualityVector and removes all that do not trigger PlaceOfPartGood bool AbstractionLayer_1::EvaluateQuality (const coor constraintCoordinate, qualityVector& qVector) { + if(constraintCoordinate.row==23 && constraintCoordinate.col==35) + cout << "in" << endl; //evaluateQuality = evaluateProbabilaty for(int i = 0;im_a1.m_connections==constraints) + qVector.erase(qVector.begin()+i); + else + i++; + + } + +} + void AbstractionLayer_1::CreateRandomPuzzle() { std::minstd_rand simple_rand; @@ -182,7 +198,11 @@ bool AbstractionLayer_1::PlaceOfPartGood(coor myCoor, uint8_t& myPart) || ((((negativePart & 0b00000011) == 0b00000011) || ((myPart & 0b00000011) == 0b00000011)) && (((myPart & 0b00000011) != 0b00000000) && (negativePart & 0b00000011) != 0b00000000)) || (((negativePart & 0b00000011) == 0b00000000) && ((myPart & 0b00000011) == 0b00000000)) ) ) + { + if(myCoor.row==18 && myCoor.col==35) + cout << "gud: " << std::bitset<8>(myPart) << endl; return true; + } return false; } diff --git a/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.h b/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.h index 7889a14..15a49b8 100644 --- a/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.h +++ b/Source/functions/AbstractionLayers/Layer1/AbstractionLayer_1.h @@ -49,6 +49,8 @@ public: bool EvaluateQuality ( coor constraintCoordinate, qualityVector& qVector)override; bool SetConstraintOnPosition( coor constraintCoordinate, AbstractionLayer_1_Properties constraint)override; bool RemoveConstraintOnPosition( coor constraintCoordinate)override; + int RemoveSimilar(qualityVector&,uint8_t&); + bool PlaceOfPartGood(coor myCoor, uint8_t& myPart); void shift(uint8_t& Part, int shifts); void setEdgeZero(); diff --git a/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.cpp b/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.cpp deleted file mode 100644 index d1177c9..0000000 --- a/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// -// Created by Niko on 1/11/2018. -// -#include "../../../header.h" -#include "AbstractionLayer_Histogram.h" - -using namespace cv; - -Mat HistogramComparer::readImages(int count) -{ - char name[100]; - Mat corr; - Mat ref_gray; - - sprintf(name, PATH, count); - Mat src = imread(name, 1); - if (!src.data) - { - cerr << "Problem loading image!!!" << endl; - return src; - } - - if(DISPLAY)imshow("src",src); - - Mat im_color; - cvtColor(src, im_color, COLOR_BGR2HSV); - return im_color; - -} - -bool AbstractionLayer_Histogram::PreProcessing(coor mySize, const vector* partArray){ -HistogramComparer localImage; - cout << "Abstraction 2 Preprocessing... " << flush; - const vector& ref_partArray = *partArray; - analyseParts analyse(mySize.row*mySize.col); - Part buf; - int iterator=0; - if(!analyse.getImages()) - { - cerr << "Error occured in getImages!" << endl; - return false; - } - else // hier werden alle vier verschiedenen Rotationsarten 'gleichzeitig' abgespeichert - //TODO rows and cols - - for(int i = 0; i < mySize.row*mySize.col; i++) - { - Mat src_img1 = localImage.readImages(i); - Mat hsv_img1; - /// Convert to HSV - cvtColor(src_img1, hsv_img1, COLOR_BGR2HSV); - - /// Using 50 bins for hue and 60 for saturation - int h_bins = 50; - int s_bins = 60; - int histSize[] = {h_bins, s_bins}; - - // hue varies from 0 to 179, saturation from 0 to 255 - float h_ranges[] = {0, 180}; - float s_ranges[] = {0, 256}; - - const float *ranges[] = {h_ranges, s_ranges}; - - // Use the o-th and 1-st channels - int channels[] = {0, 1}; - - /// Histograms - MatND hist_img1; - - /// Calculate the histograms for the HSV images - calcHist(&hsv_img1, 1, channels, Mat(), hist_img1, 2, histSize, ranges, true, false); - // normalize(hist_img1, hist_img1, 0, 1, NORM_MINMAX, -1, Mat()); - - ref_partArray[iterator]->m_Histogram.image=hsv_img1; - iterator++; - - } - - - InitialiseConstraintMatrixSize(mySize.col, mySize.row); //col row switched in this function - - cout << "Done!" << endl; - return true; - -} - -bool AbstractionLayer_Histogram::EvaluateQuality (const coor constraintCoordinate, qualityVector& qVector){ - - //evaluateQuality = evaluateProbabilaty - for(int i = 0;i < qVector.size();i++) - { - if(PlaceOfPartGood(constraintCoordinate, qVector[i].second->m_Histogram.image)) - { - qVector[i].first=1; - - continue; - } - qVector[i].first=0; - } - - -} -bool AbstractionLayer_Histogram::PlaceOfPartGood(coor myCoor, Mat& myPart) -{ - - HistogramComparer localComparer; - //sets coordinates to correct position for layer - - if( myCoor.row == 0 && myCoor.col == 0){return true;} - else if(myCoor.col == 0 && myCoor.row >0){ - if(localComparer.CompareHistogram(m_constraintMatrix[myCoor.col][myCoor.row-1].image, myPart)){ - return true; - } - else return false; - } - else if( myCoor.row == 0 && myCoor.col >0){ - if(localComparer.CompareHistogram(m_constraintMatrix[myCoor.col-1][myCoor.row].image, myPart)){ - return true; - } - else return false; - } - else if (myCoor.col > 0 && myCoor.row >0){ - if( localComparer.CompareHistogram(m_constraintMatrix[myCoor.col][myCoor.row-1].image, myPart) && - localComparer.CompareHistogram(m_constraintMatrix[myCoor.col-1][myCoor.row].image, myPart)){ - return true; - } - else return false; - }else return false; - - -} - -bool HistogramComparer::CompareHistogram(Mat hist_img1,Mat hist_img2) -{ - // Correlation - double Correlation = compareHist(hist_img1, hist_img2, CV_COMP_CORREL); - - if(Correlation > 0.95 ){ - - return true; - } - else - return false; -} - -bool AbstractionLayer_Histogram::SetConstraintOnPosition(const coor constraintCoordinate, const AbstractionLayer_Histogram_Properties constraint) -{ - m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].image=constraint.image; - //m_constraintMatrix[constraintCoordinate.col+1][constraintCoordinate.row+1].m_connections=constraint.m_connections; -} - - - -bool AbstractionLayer_Histogram::RemoveConstraintOnPosition(const coor constraintCoordinate) -{ - Mat dummy(1,1,0); - m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].image = dummy; -} diff --git a/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.h b/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.h deleted file mode 100644 index 5fb2a82..0000000 --- a/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// Created by Niko on 1/11/2018. -// - -#ifndef MPK_PUZZLE_ABSTRACTIONLAYER_HISTOGRAM_H -#define MPK_PUZZLE_ABSTRACTIONLAYER_HISTOGRAM_H -#define DISPLAY false -#define PATH "..\\..\\..\\pieces\\%04d.jpg" -#include "opencv2/highgui/highgui.hpp" -#include "opencv2/imgproc/imgproc.hpp" -#include "AbstractionLayer_Histogram_Properties.h" -#include "../AbstraktionLayer_Base.h" - -using namespace std; -using namespace cv; - -class AbstractionLayer_Histogram : public AbstractionLayer_Base -{ -public: - bool PreProcessing(coor mySize, const vector* partArray) override ; - bool EvaluateQuality ( coor constraintCoordinate, qualityVector& qVector)override; - bool RemoveConstraintOnPosition( coor constraintCoordinate)override; - bool PlaceOfPartGood(coor myCoor, Mat& myPart); - bool SetConstraintOnPosition( coor constraintCoordinate, AbstractionLayer_Histogram_Properties constraint)override; - qualityVector returnInBox(vector& PuzzleBox); - void printConstraintMatrix(); - -private: -}; - -class HistogramComparer{ -public: - Mat readImages(int); - bool CompareHistogram(Mat Part, Mat RefPart); -private: - -}; - -#endif //MPK_PUZZLE_ABSTRACTIONLAYER_HISTOGRAM_H - diff --git a/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram_Properties.h b/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram_Properties.h deleted file mode 100644 index bb1270a..0000000 --- a/Source/functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram_Properties.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// Created by Niko on 1/11/2018. -// - -#ifndef MPK_PUZZLE_ABSTRACTIONLAYER_HISTOGRAM_PROPERTIES_H -#define MPK_PUZZLE_ABSTRACTIONLAYER_HISTOGRAM_PROPERTIES_H -#include -#include "opencv2/highgui/highgui.hpp" -#include "opencv2/imgproc/imgproc.hpp" - -using namespace cv; -class AbstractionLayer_Histogram_Properties -{ -public: - AbstractionLayer_Histogram_Properties() : Correlation(-1){} - double getCorrelation(){return Correlation;} - Mat getmHistogram(){return m_Histogram;} - -private: - - double Correlation; - Mat m_Histogram; - Mat image; - friend class AbstractionLayer_Histogram; - - -}; -#endif //MPK_PUZZLE_ABSTRACTIONLAYER_HISTOGRAM_PROPERTIES_H - diff --git a/Source/functions/solve/puzzleExtension.cpp b/Source/functions/solve/puzzleExtension.cpp index 40bb3a5..7037108 100644 --- a/Source/functions/solve/puzzleExtension.cpp +++ b/Source/functions/solve/puzzleExtension.cpp @@ -66,7 +66,6 @@ void Puzzle::shuffle() void Puzzle::removeConstrains(coor removeCoordinates) { this->a1.RemoveConstraintOnPosition(removeCoordinates); - this->a3.RemoveConstraintOnPosition(removeCoordinates); //TODO!! Add other layer remove here } void Puzzle::setConstraints(coor setConstraints, Part* constraintPiece) @@ -78,12 +77,17 @@ void Puzzle::setConstraints(coor setConstraints, Part* constraintPiece) //a1 this->a1.SetConstraintOnPosition(setConstraints,constraintPiece->m_a1); - //a3 - this->a3.SetConstraintOnPosition(setConstraints,constraintPiece->m_Histogram); //TODO!! Add other layer remove here } +int Puzzle::removeSimilar(qualityVector& qVector, Part& myPart) +{ + //a1 + uint8_t tmpConnections=myPart.m_a1.getConnections(); + a1.RemoveSimilar(qVector,tmpConnections); +} + void Puzzle::createRandomPuzzle() { a1.CreateRandomPuzzle(); @@ -156,8 +160,6 @@ Mat Puzzle::resultImage( vector& log){ imageW = imageH; imageH = temp; - cout<<"imageW "<& log){ // imshow("result",result); // waitKey(0); } - cout << log.size() << endl; - cout << log[0].PieceCollector.size() << endl; cout << it.PieceCollector[0].second->GetPartID() << endl; diff --git a/Source/functions/solve/structure.cpp b/Source/functions/solve/structure.cpp index 240e204..27bed9e 100755 --- a/Source/functions/solve/structure.cpp +++ b/Source/functions/solve/structure.cpp @@ -44,11 +44,15 @@ void createNextLogElement(vector& log, Puzzle& puzzleMat) log.emplace_back(LogEntry(coor(0, 0))); log.back().myCoor = calculateNextCoor(log, puzzleMat); puzzleMat.dp.DestructionOfSurrounding(log.back().myCoor);//calculate dp from surrounding + cout << "-----------------------" << endl; + cout << "destr-array:" << endl; + for(auto it:puzzleMat.dp.m_constraintMatrix[log.back().myCoor.col][log.back().myCoor.row].DestructionArray) + cout << it << endl; //get all not set pieces for(auto it:puzzleMat.p_myBox) if(!it->set) log.back().PieceCollector.emplace_back(pair(0,it)); - solve(log,puzzleMat); + solve(log,puzzleMat); } @@ -72,7 +76,8 @@ coor calculateNextCoor(vector& log, Puzzle& puzzleMat) void solve(vector& log,Puzzle& puzzleMat) { log.back().abstractionLevel = puzzleMat.dp.getNextAbstractionLayer(log.back().myCoor,log.back().abstractionLevel); //sets in abstractionLevel - //status(log,p_Box,puzzleMat); + cout << "ab: " << log.back().abstractionLevel << endl; + //status(log,p_Box,puzzleMat); //TODO!! Add more layers here switch(log.back().abstractionLevel) { @@ -80,7 +85,7 @@ void solve(vector& log,Puzzle& puzzleMat) puzzleMat.a1.EvaluateQuality(log.back().myCoor, log.back().PieceCollector); break; case 1://histogram - puzzleMat.a3.EvaluateQuality(log.back().myCoor,log.back().PieceCollector); + return; break; case -1://random setsolution(log,puzzleMat); @@ -88,7 +93,6 @@ void solve(vector& log,Puzzle& puzzleMat) default: break; } - float worth = capLogElements(log); calculateTrueDestructionPower(log,puzzleMat, worth); CalculateNewCombinedQuality(log, log.back().PieceCollector, puzzleMat.combinedQualityVector); @@ -110,11 +114,16 @@ void setsolution(vector& log, Puzzle& puzzleMat) //tell log entry that it is set log.back().Set(); 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 << "log:" << endl; + for(auto it:log.back().PieceCollector) + cout << std::bitset<8>(it.second->m_a1.getConnections()) << "|" << it.second->GetPartID() << endl; } bool backtrack(vector& log, Puzzle& puzzleMat) { + cout << "backtracking" ; if(log.empty()) { cout << "Puzzle not solveable!" << endl; @@ -124,10 +133,16 @@ bool backtrack(vector& log, Puzzle& puzzleMat) //if more pieces possible, tset piece as not logged if((log.back().PieceCollector.size())>1) { + cout << " next piece" << endl; for(int i=0;iGetPartID()==log.back().PieceCollector.begin()->second->GetPartID())//sets all with partid puzzleMat.p_myBox[i]->set=false; - log.back().PieceCollector.erase(log.back().PieceCollector.begin()); + + Part myPart = *log.back().PieceCollector[0].second;//tmpsaves bad part + log.back().PieceCollector.erase(log.back().PieceCollector.begin());//removes bad part from log + puzzleMat.removeSimilar(log.back().PieceCollector,myPart); //removes all pieces from log that are similar to bad part + //TODO remove this when further layers are added!!! + if(log.back().PieceCollector.size()==1) log.back().decreaseRandomed(); @@ -139,6 +154,7 @@ bool backtrack(vector& log, Puzzle& puzzleMat) //else remove log element and backtrack once more else { + cout << " no more pieces" << endl; puzzleMat.removeConstrains(log.back().myCoor); //this should remove constraints from all layers if((log.back().PieceCollector.size())) for(int i=0;i& log, Puzzle& puzzleMat) //this is addon stuff that should later all be extracted into a sererate cpp as it is not core dispatcher functionality - void calculateTrueDestructionPower(vector& log, Puzzle& puzzleMat, float Layerworth) { float destructionPower = sqrt( Layerworth * puzzleMat.dp.m_constraintMatrix[0][0].SpeedTable[log.back().abstractionLevel]); @@ -170,6 +185,7 @@ void calculateTrueDestructionPower(vector& log, Puzzle& puzzleMat, flo // PART RAUER_WEIDINGER float capLogElements(vector& log) { + // Till Now only ground structure -> incorrect variable ans vector names double limit = 0.6; double diff = 0; diff --git a/Source/header/input.h b/Source/header/input.h index 8fd6181..6cee3da 100755 --- a/Source/header/input.h +++ b/Source/header/input.h @@ -8,7 +8,6 @@ #include "../functions/AbstractionLayers/Layer1/AbstractionLayer_1_Properties.h" #include "../functions/AbstractionLayers/DestructionPower/DestructionPower_Properties.h" -#include "../functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram_Properties.h" class LayerContainer; @@ -43,7 +42,6 @@ public: bool set; AbstractionLayer_1_Properties m_a1; - AbstractionLayer_Histogram_Properties m_Histogram; private: int32_t m_partID; uint8_t m_numOfRotations; diff --git a/Source/header/solve.h b/Source/header/solve.h index a27bef6..c0a48ca 100755 --- a/Source/header/solve.h +++ b/Source/header/solve.h @@ -9,7 +9,6 @@ #include "../functions/AbstractionLayers/Layer1/AbstractionLayer_1.h" #include "../functions/AbstractionLayers/DestructionPower/DestructionPower.h" -#include "../functions/AbstractionLayers/LayerHistogram/AbstractionLayer_Histogram.h" using namespace std; @@ -47,7 +46,6 @@ public: createBox(); createp_box(); dp.PreProcessing({cols,rows}, nullptr); a1.PreProcessing({cols,rows}, &p_myBox); - a3.PreProcessing({cols,rows},&p_myBox); return true; } @@ -55,10 +53,11 @@ public: DestructionPower dp; AbstractionLayer_1 a1; - AbstractionLayer_Histogram a3; void removeConstrains(coor removeCoordinates); void setConstraints(coor setConstraints, Part *constraintPiece); + int removeSimilar(qualityVector&, Part&); + void printPuzzle(); void printBox(); Mat resultImage(vector&);