Skip to content
Snippets Groups Projects
Commit 81160250 authored by Thomas Boy's avatar Thomas Boy
Browse files

a lot changes, will write usefull output now

parent 40d32429
No related branches found
No related tags found
No related merge requests found
......@@ -10,27 +10,30 @@ based on original demo.cpp
#include <stdio.h> /* printf, scanf, puts, NULL */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#include <ctime>
//opencv
#include <opencv2/opencv.hpp>
//bgslibrary
#include "package_bgs/bgslibrary.h"
//my class
#include "package_bgs/Tapter.h"
std::string mNzero(int i)
{
std::ostringstream convert;
convert << i ;
std::string numberString = convert.str();
std::string newNumberString = std::string(10 - numberString.length(), '0') + numberString;
return newNumberString;
}
std::string getFileName(int i)
{
//cv::String inputPath= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/data/";
std::string fileName = "/data/"+ mNzero(i) + ".jpg";
return fileName;
}
#include "package_bgs/ttoolbox.h"
//std::string mNzero(int i)
//{
// std::ostringstream convert;
// convert << i ;
// std::string numberString = convert.str();
// std::string newNumberString = std::string(10 - numberString.length(), '0') + numberString;
// return newNumberString;
//}
//std::string getFileName(int i)
//{
// //cv::String inputPath= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/data/";
// std::string fileName = "/data/"+ mNzero(i) + ".jpg";
// return fileName;
//}
char* getCmdOption(char ** begin, char ** end, const std::string & option)
......@@ -167,8 +170,11 @@ int main(int argc, char * argv[])
Tapter *bgs = new Tapter;
bgs->setInitialFrameCounter(0);
bgs->setPathOut(outputDir);
bgs->setInitialFrameCounter(0);
bgs->setFlagWrite(0);
bgs->setFlagWriteDBGpic(0);
//see paper https://dl.acm.org/citation.cfm?id=2321600
//https://ieeexplore.ieee.org/document/4527178/
......@@ -206,12 +212,12 @@ int main(int argc, char * argv[])
//! we train with first 54 on random draws
cout <<"b) we train the background with random choosen files"<< fileName<<endl;
list<string> myRandomTrainList; //we save all draws in a list which will save to the results
vector<string> myRandomTrainList; //we save all draws in a list which will save to the results
for(i=0;i<54;i++) //TODO make 54 as parameter
{
//random index
int index = rand() % steps + begin; //TODO: double check no double draw ??
fileName = inputDir + getFileName(index);
fileName = inputDir + TToolBox::getFileName(index);
myRandomTrainList.push_back(fileName);
cout <<"load rnd file :"<< fileName<<endl;
......@@ -232,10 +238,18 @@ int main(int argc, char * argv[])
}
cout <<"c) we produce train the background with random choosen files"<< fileName<<endl;
bgs->setInitialFrameCounter(0);
bgs->setFlagWrite(1);
bgs->setFlagWriteDBGpic(1);
clock_t beginAll = clock();
for(i=begin;i<begin+steps;i++)
{
fileName = inputDir + getFileName(i);
clock_t begin = clock();
fileName = inputDir + TToolBox::getFileName(i);
cout <<"load file :"<< fileName<<endl;
//cv::imwrite(convert.str().c_str(), img_output);
img_input = imread(fileName.c_str(), CV_LOAD_IMAGE_COLOR);
......@@ -253,27 +267,23 @@ int main(int argc, char * argv[])
cout<<"error loading file: "<< fileName<<", will abort"<<endl;
return EXIT_FAILURE;
}
}
/*
while (key != 'q')
{
capture >> img_input;
if (img_input.empty()) break;
cv::imshow("input", img_input);
cv::Mat img_mask;
cv::Mat img_bkgmodel;
bgs->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask image
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
//if(!img_mask.empty())
// cv::imshow("Foreground", img_mask);
// do something
cout <<"process took:\t"<<elapsed_secs<<"s"<<endl;
}
key = cvWaitKey(33);
}
clock_t endAll = clock();
double elapsed_secs = double(endAll - beginAll) / CLOCKS_PER_SEC;
cout <<"process"<<amountFiles<<" took:\t"<<(int)(elapsed_secs/60)<<" min"<<endl;
//we write the random file list
//format output file
std::string nameOutRandomFile = outputDir + "randlist.yml";
*/
FileStorage fs(nameOutRandomFile.c_str(), FileStorage::WRITE);
fs << "randomlist" << myRandomTrainList;
fs.release();
delete bgs;
......
......@@ -26,6 +26,8 @@ Tapter::Tapter() :
frameCounter = 0;
//inputPath = ".";
outputPath = ".";
flagWrite = -1;
writeDbgPic = -1;
}
......@@ -35,6 +37,16 @@ Tapter::~Tapter()
std::cout << "~Tapter()" << std::endl;
}
void Tapter::setFlagWrite(short flag)
{
flagWrite = flag;
}
void Tapter::setFlagWriteDBGpic(short flag)
{
writeDbgPic = flag;
}
void Tapter::setPathOut(std::string outPath)
{
outputPath = outPath;
......@@ -99,52 +111,6 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
vector<vector<Point> > contours = applyCannyEdgeAndCalcCountours(img_output,threshholdMin,threshholdMax,apertureSize);
//! produce center of convex hull of all polygones
// //TODO double check if ne contour sharing a center point ? nearby ??
// //TODO we should apply everything to the selection !!!!
// //! calc convex hull of all remaining contours *************************
// vector<Point> allContourPoints;
// //we merge all points
// for (size_t cC = 0; cC < contours.size(); ++cC)
// for(size_t cP =0; cP < contours[cC].size(); cP++)
// {
// Point currentContourPixel = contours[cC][cP];
// allContourPoints.push_back(currentContourPixel);
// }
// ////calc the hull ******************
// vector<Point> hullComplete(allContourPoints.size());
// convexHull( Mat(allContourPoints), hullComplete, false );
// if(!hullComplete.empty())//if we any elements, we process further
// {
// // Point2f roiCenter;
// // float roiRadius;
// //calc the min circle around
// //minEnclosingCircle(hullComplete,roiCenter,roiRadius);
//#ifdef MC_SHOW_STEP_ANALYSE
// Mat imgConvexHull = Mat::zeros( img_input.size(), CV_8UC3 );
// imgConvexHull = Scalar(255,255,255); //fille the picture
// Scalar colorB( 0,0,255,255 );//red
// polylines(imgConvexHull, hullComplete, true, colorB, 1, 8);
// //draw circle around
// //circle( imgConvexHull, roiCenter, (int) roiRadius, colorB, 2, 8, 0 );
// //we draw it
// cv::String outpath2= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/result/";
// std::ostringstream convert2;
// convert2 << outpath2 << frameCounter <<"_convex_hull.jpg";
// cv::imwrite(convert2.str().c_str(), imgConvexHull);
//#endif
// //TODO: we need to order the points to get a nice polygon, otherwise not usefull
// //we also try to find the aproximate polygon*****************
//// vector<Point> aproxiCurve;
......@@ -180,12 +146,10 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
//// cout<<"approximate poly has not enough points will skip file: "<<frameCounter<<endl;
////#endif
// }
// else
// cout<<"convex hull has no points will skip file: "<<frameCounter<<endl;
///we make a selection out of all counters with area sizes******************************
vector<vector<Point> > contourSelection;
//we exlcude very small one and very big ones
//we calc all min rotated rectangles for all contour from candy egde detect
......@@ -196,7 +160,6 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
minRect[i] = minAreaRect( Mat(contours[i]) ); //may use boundingRect ?? to use fix non rotated rectangles ?
vector<Point2f> recCenterPoints;
vector<vector<Point> > contourSelection;
float areaMinThreshold = 150;
float areaMaxThreshold = 15000; //TODO apply moving filter ??, an more adaptive approach
......@@ -237,19 +200,132 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
///we calc the moments from the contour selection
vector<Moments> mu(contourSelection.size() );
for( int i = 0; i < contourSelection.size(); i++ )
for( size_t i = 0; i < contourSelection.size(); i++ )
{
mu[i] = moments( contourSelection[i], false );
}
// Get the mass centers:
vector<Point2f> massCenters( contourSelection.size() );
for( int i = 0; i < contourSelection.size(); i++ )
for( size_t i = 0; i < contourSelection.size(); i++ )
{
massCenters[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 );
}
//! calc convex hull of all points of the contour selection *********
//TODO produce center of convex hull of all polygones
//TODO double check if ne contour sharing a center point ? nearby ??
//we merge all points
vector<Point> allContourPoints;
for (size_t cC = 0; cC < contourSelection.size(); ++cC)
for(size_t cP =0; cP < contourSelection[cC].size(); cP++)
{
Point currentContourPixel = contourSelection[cC][cP];
allContourPoints.push_back(currentContourPixel);
}
//calc the hull ******************
vector<Point> conHull(allContourPoints.size());
convexHull( Mat(allContourPoints), conHull, false );
// Point roiCenter;
// float roiRadius;
//calc the min circle around
//minEnclosingCircle(conHull,roiCenter,roiRadius);
//we calc the mass center of the convex hull
///we calc the moments from the contour selection
Moments muConvexHull;
Point2f muConvexHullMassCenter(0.0,0.0);
if(!conHull.empty())
{
muConvexHull = moments(conHull, true );
muConvexHullMassCenter= Point2f( muConvexHull.m10/muConvexHull.m00 , muConvexHull.m01/muConvexHull.m00 );
}
#ifdef MC_SHOW_STEP_ANALYSE
if(!conHull.empty())//if we any elements, we process further
{
Mat imgConvexHull = Mat::zeros( img_input.size(), CV_8UC3 );
imgConvexHull = Scalar(255,255,255); //fille the picture
Scalar colorB( 0,0,255,255 );//red
polylines(imgConvexHull, hullComplete, true, colorB, 1, 8);
//draw circle around
//circle( imgConvexHull, roiCenter, (int) roiRadius, colorB, 2, 8, 0 );
//we draw it
cv::String outpath2= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/result/";
std::ostringstream convert2;
convert2 << outpath2 << frameCounter <<"_convex_hull.jpg";
cv::imwrite(convert2.str().c_str(), imgConvexHull);
}
else
cout<<"convex hull has no points will skip file: "<<frameCounter<<endl;
#endif
if(flagWrite)
{
//format output file
std::string nameOutPutFileData = outputPath + TToolBox::mNzero(frameCounter) + ".yml";
FileStorage fs(nameOutPutFileData.c_str(), FileStorage::WRITE);
fs << "masscenters" << massCenters;
fs << "polygonselection"<< contourSelection;
fs << "convexhull"<<conHull;
fs << "masscenterconvexhull"<<muConvexHullMassCenter;
//fs << "masscenters" << "[";
// for( size_t i = 0; i < massCenters.size(); i++ )
// {
// Point2f p = massCenters[i];
// fs << "{:" << "x" << (float) p.x << "y" << (float) p.y << "}";
// }
// fs << "]";
fs.release();
}
if(writeDbgPic)
{
Scalar colorRed( 0,0,255,255 );//red
RNG rng(4344234);
Mat imgDebugPaint2 = Mat::zeros( img_input.size(), CV_8UC3 );
imgDebugPaint2 = Scalar(255,255,255); //fill the picture white
//we write all polyies of the selection and the mass centers with a random color
for( size_t i = 0; i< contourSelection.size(); i++ )
{
//random color
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
//contour
drawContours( imgDebugPaint2, contourSelection, i, color, 1, LINE_AA);
//draw the center
circle( imgDebugPaint2, massCenters[i], 4, color, -1, 8, 0 );
}
//we write the convex hull
if(!conHull.empty())
{
//the poly
polylines(imgDebugPaint2, conHull, true, colorRed, 1, 8);
//the center
circle( imgDebugPaint2,muConvexHullMassCenter, 4, colorRed, -1, 8, 0 );
}
//we make a copy
Mat imgOverlay2 = img_input.clone();
//we add a overlay of our paitings
addWeighted( imgDebugPaint2, 0.7, imgOverlay2, 0.3, 0.0, imgOverlay2);
//we write the file down
std::string nameOutPutFileDBGpic = outputPath + TToolBox::mNzero(frameCounter) + ".jpg";
imwrite(nameOutPutFileDBGpic.c_str(),imgOverlay2);
}
#ifdef MC_SHOW_STEP_ANALYSE
......@@ -325,7 +401,7 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
}
else
cout<<"error no contour in selective list left, skip frame: "<<frameCounter<<endl;
#endif
//********
......@@ -335,7 +411,9 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
convert << outpath << frameCounter++ << ".jpg";
cv::imwrite(convert.str().c_str(), img_output);
//**** end
#else
frameCounter++;
#endif
delete frame;
......@@ -420,8 +498,6 @@ vector<vector<Point> > Tapter::applyCannyEdgeAndCalcCountours(Mat imgSource, dou
#endif
// return minRect;
return contours;
}
......@@ -26,8 +26,10 @@ along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>.
#include "lb/BGModelSom.h"
#include "IBGS.h"
#include "ttoolbox.h"
#define MC_SHOW_STEP_ANALYSE
//#define MC_SHOW_STEP_ANALYSE
using namespace lb_library;
using namespace lb_library::AdaptiveSOM;
......@@ -50,6 +52,8 @@ namespace bgslibrary
int frameCounter; //
std::string inputPath;
short flagWrite;
short writeDbgPic;
std::string outputPath;
public:
......@@ -61,6 +65,14 @@ namespace bgslibrary
// void setPaths(std::string inPath,std::string outPath);
void setPathOut(std::string outPath);
//! 1 is on
//! other no write
void setFlagWrite(short flag);
//! 1 is on
//! other no write
void setFlagWriteDBGpic(short flag);
void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel);
private:
......@@ -68,6 +80,7 @@ namespace bgslibrary
void loadConfig();
vector<vector<Point> > applyCannyEdgeAndCalcCountours(cv::Mat imgSource, double threshholdMin, double threshholdMax, int apertureSize);
};
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment