Skip to content
Snippets Groups Projects
Commit 5f5c8605 authored by even's avatar even
Browse files

Detected lines selection (right mouse)

parent e16c25f9
No related branches found
No related tags found
No related merge requests found
#include <QtGui>
#include <iostream>
#include <fstream>
#include <cstdlib>
......@@ -16,6 +17,7 @@ const int BSDetectionWidget::BACK_GRADX = 4;
const int BSDetectionWidget::BACK_GRADY = 5;
const int BSDetectionWidget::DEFAULT_PEN_WIDTH = 1;
const int BSDetectionWidget::SELECT_TOL = 5;
......@@ -26,17 +28,18 @@ BSDetectionWidget::BSDetectionWidget (QWidget *parent)
// Sets initial user inputs parameters
setFocus ();
grabKeyboard ();
picking = false;
udef = false;
nodrag = true;
// Initializes the gradient map and the auxiliary views
gMap = NULL;
// accuview = NULL;
strucview = NULL;
profileview = NULL;
idetview = NULL;
cannyview = NULL;
yorkview = NULL;
// accuview = NULL; // DEV
strucview = NULL; // DEV
profileview = NULL; // DEV
idetview = NULL; // DEV
cannyview = NULL; // DEV
yorkview = NULL; // DEV
// Sets initial user outputs parameters
verbose = false;
......@@ -67,12 +70,12 @@ BSDetectionWidget::BSDetectionWidget (QWidget *parent)
BSDetectionWidget::~BSDetectionWidget ()
{
// if (accuview != NULL) delete accuview;
if (strucview != NULL) delete strucview;
if (profileview != NULL) delete profileview;
if (idetview != NULL) delete idetview;
if (cannyview != NULL) delete cannyview;
if (yorkview != NULL) delete yorkview;
// if (accuview != NULL) delete accuview; // DEV
if (strucview != NULL) delete strucview; // DEV
if (profileview != NULL) delete profileview; // DEV
if (idetview != NULL) delete idetview; // DEV
if (cannyview != NULL) delete cannyview; // DEV
if (yorkview != NULL) delete yorkview; // DEV
}
......@@ -91,9 +94,9 @@ QSize BSDetectionWidget::openImage (const QString &fileName, int type)
buildGradientImage (0);
update ();
if (idetview != NULL) idetview->setImage (&loadedImage, gMap);
if (profileview != NULL) profileview->setImage (&loadedImage, gMap);
if (strucview != NULL) strucview->setGradientImage (&gradImage);
if (idetview != NULL) idetview->setImage (&loadedImage, gMap); // DEV
if (profileview != NULL) profileview->setImage (&loadedImage, gMap); // DEV
if (strucview != NULL) strucview->setGradientImage (&gradImage); // DEV
xMaxShift = (width > maxWidth ? maxWidth - width : 0);
yMaxShift = (height > maxHeight ? maxHeight - height : 0);
......@@ -201,6 +204,7 @@ void BSDetectionWidget::paintEvent (QPaintEvent *)
}
// DEV IN
/*
void BSDetectionWidget::closeAccuAnalyzer ()
{
......@@ -316,6 +320,7 @@ void BSDetectionWidget::switchIdetAnalyzer ()
idetview->show ();
}
}
// DEV OUT
void BSDetectionWidget::switchHighlightColors ()
......@@ -342,54 +347,94 @@ void BSDetectionWidget::switchArlequin ()
void BSDetectionWidget::mousePressEvent (QMouseEvent *event)
{
oldp1.set (p1);
oldp2.set (p2);
oldudef = udef;
int ex = zoom * (event->pos().x () - xShift);
int ey = zoom * (event->pos().y () - yShift);
p1 = Pt2i (ex, height - 1 - ey);
if (p1.manhattan (p2) < 10) p1.set (oldp1);
else if (p1.manhattan (oldp1) < 10) p1.set (p2);
udef = true;
int ey = height - 1 - zoom * (event->pos().y () - yShift);
if (event->button () == Qt::RightButton)
{
vector<BlurredSegment *> bsl = detector.getBlurredSegments ();
if (! bsl.empty ())
{
bool searching = true;
int nb = 0;
vector<BlurredSegment *>::iterator it = bsl.begin ();
while (searching && it != bsl.end ())
{
if (*it != NULL)
{
DigitalStraightSegment *dss = (*it)->getSegment ();
if (dss != NULL)
{
if (dss->contains (Pt2i (ex, ey), SELECT_TOL)) searching = false;
else nb ++;
}
else nb ++;
}
else nb ++;
it ++;
}
cout << "Selection of segment " << (searching ? 0 : nb + 1) << endl;
detector.setMaxDetections (searching ? 0 : nb + 1);
extract ();
}
picking = true;
}
else
{
oldp1.set (p1);
oldp2.set (p2);
oldudef = udef;
p1 = Pt2i (ex, ey);
if (p1.manhattan (p2) < 10) p1.set (oldp1);
else if (p1.manhattan (oldp1) < 10) p1.set (p2);
udef = true;
}
}
void BSDetectionWidget::mouseReleaseEvent (QMouseEvent *event)
{
int ex = zoom * (event->pos().x () - xShift);
int ey = zoom * (event->pos().y () - yShift);
p2 = Pt2i (ex, height - 1 - ey);
if (p1.equals (p2))
{
p1.set (oldp1);
p2.set (oldp2);
udef = oldudef;
}
else
if (! picking)
{
cerr << "p1 defined: " << p1.x () << " " << p1.y () << endl;
cerr << "p2 defined: " << p2.x () << " " << p2.y () << endl;
detector.resetMaxDetections ();
extract ();
int ex = zoom * (event->pos().x () - xShift);
int ey = zoom * (event->pos().y () - yShift);
p2 = Pt2i (ex, height - 1 - ey);
if (p1.equals (p2))
{
p1.set (oldp1);
p2.set (oldp2);
udef = oldudef;
}
else
{
cerr << "p1 defined: " << p1.x () << " " << p1.y () << endl;
cerr << "p2 defined: " << p2.x () << " " << p2.y () << endl;
detector.resetMaxDetections ();
extract ();
}
}
}
void BSDetectionWidget::mouseMoveEvent (QMouseEvent *event)
{
int ex = zoom * (event->pos().x () - xShift);
int ey = zoom * (event->pos().y () - yShift);
p2 = Pt2i (ex, height - 1 - ey);
if (verbose) cerr << "(" << p1.x () << ", " << p1.y () << ") ("
<< p2.x () << ", " << p2.y () << ")" << endl;
if (p1.manhattan (p2) > 5
&& (width > p2.x() && height > p2.y()
&& p2.x() > 0 && p2.y() > 0))
if (picking) picking = false;
else
{
nodrag = false;
extract ();
nodrag = true;
detector.setMaxTrials (0);
int ex = zoom * (event->pos().x () - xShift);
int ey = zoom * (event->pos().y () - yShift);
p2 = Pt2i (ex, height - 1 - ey);
if (verbose) cerr << "(" << p1.x () << ", " << p1.y () << ") ("
<< p2.x () << ", " << p2.y () << ")" << endl;
if (p1.manhattan (p2) > 5
&& (width > p2.x() && height > p2.y()
&& p2.x() > 0 && p2.y() > 0))
{
nodrag = false;
extract ();
nodrag = true;
detector.setMaxTrials (0);
}
}
}
......@@ -839,6 +884,7 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
cout << "Selection stroke saved" << endl;
break;
// DEV IN
case Qt::Key_Percent :
if (cannyview == NULL)
cannyview = new BSCannyView (&loadedImage, &detector);
......@@ -850,6 +896,7 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
yorkview = new BSYorkView (&loadedImage, &detector);
yorkview->show ();
break;
// DEV OUT
case Qt::Key_Plus :
if (zoom > 1)
......@@ -909,6 +956,7 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
displayDetectionResult ();
break;
// DEV IN
case Qt::Key_1 :
switchPixelAnalyzer ();
break;
......@@ -924,6 +972,7 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
case Qt::Key_4 :
switchIdetAnalyzer ();
break;
// DEV OUT
case Qt::Key_5 :
// Switches the crosswise segment detection
......@@ -956,14 +1005,17 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
localTest ();
break;
}
// DEV IN
else if (strucview != NULL && strucview->isActiveWindow ())
{
if (strucview->processKeyEvent (event)) extract ();
}
/* else if (accuview != NULL && accuview->isActiveWindow ())
/*
else if (accuview != NULL && accuview->isActiveWindow ())
{
if (accuview->processKeyEvent (event)) extract ();
} */
}
*/
else if (profileview != NULL && profileview->isActiveWindow ())
{
if (profileview->processKeyEvent (event)) extract ();
......@@ -980,6 +1032,7 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
{
if (cannyview->processKeyEvent (event)) extract ();
}
// DEV OUT
}
......@@ -1157,7 +1210,7 @@ void BSDetectionWidget::writeDetectionResult ()
}
}
else
{
{
ofstream outf ("segs.txt", ios::out);
vector<BlurredSegment *>::iterator it = bss.begin ();
while (it != bss.end ())
......@@ -1223,6 +1276,7 @@ void BSDetectionWidget::displayDetectionResult ()
// Update auxiliary view if not dragging
if (nodrag)
{
// DEV IN
if (idetview != NULL) idetview->update ();
if (profileview != NULL)
{
......@@ -1235,6 +1289,7 @@ void BSDetectionWidget::displayDetectionResult ()
strucview->scene()->update ();
strucview->repaint ();
}
// DEV OUT
if (verbose) writeDetectionStatus ();
if (statsOn) writeStats ();
}
......@@ -1561,6 +1616,7 @@ void BSDetectionWidget::performanceTest ()
{
if (p1.equals (p2))
{
// DEV IN
/*
if (cannyview)
{
......@@ -1583,6 +1639,7 @@ void BSDetectionWidget::performanceTest ()
else
{
*/
// DEV OUT
// No stroke -> automatic
cout << "Automatic extraction test" << endl;
clock_t start = clock ();
......@@ -1590,7 +1647,7 @@ void BSDetectionWidget::performanceTest ()
double diff = (clock () - start) / (double) CLOCKS_PER_SEC;
cout << "Test run : " << diff << endl;
extract ();
// }
// } // DEV
}
else
{
......
......@@ -8,12 +8,12 @@
#include <QVector>
#include <fstream>
#include "bsdetector.h"
// #include "bsaccumulatorview.h"
#include "bsstructureview.h"
#include "bsprofileview.h"
#include "bsidetview.h"
#include "bscannyview.h"
#include "bsyorkview.h"
// #include "bsaccumulatorview.h" // DEV
#include "bsstructureview.h" // DEV
#include "bsprofileview.h" // DEV
#include "bsidetview.h" // DEV
#include "bscannyview.h" // DEV
#include "bsyorkview.h" // DEV
using namespace std;
......@@ -221,6 +221,8 @@ private:
/** Default value for pen width. */
static const int DEFAULT_PEN_WIDTH;
/** Tolerence for segment picking (in count of naive lines) */
static const int SELECT_TOL;
/** Initial scan start point. */
......@@ -233,6 +235,8 @@ private:
Pt2i oldp2;
/** Flag indicating if the mouse is not dragging. */
bool nodrag;
/** Flag indicating if picking mode is set. */
bool picking;
/** Flag indicating if the detection is user defined. */
bool udef;
/** Saved user definition flag. */
......@@ -296,18 +300,18 @@ private:
/** Blurred segment detector. */
BSDetector detector;
/** Initial detection graphics view. */
BSIdetView *idetview;
/** Scanned profile graphics view. */
BSProfileView *profileview;
/** Filter accumulator view. */
// BSAccumulatorView *accuview;
/** Blurred segment contents view. */
BSStructureView *strucview;
/** CannyLine comparator view. */
BSCannyView *cannyview;
/** YorkLine comparator view. */
BSYorkView *yorkview;
/** Initial detection graphics view. */ // DEV
BSIdetView *idetview; // DEV
/** Scanned profile graphics view. */ // DEV
BSProfileView *profileview; // DEV
/** Filter accumulator view. */ // DEV
// BSAccumulatorView *accuview; // DEV
/** Blurred segment contents view. */ // DEV
BSStructureView *strucview; // DEV
/** CannyLine comparator view. */ // DEV
BSCannyView *cannyview; // DEV
/** YorkLine comparator view. */ // DEV
BSYorkView *yorkview; // DEV
/** Aggregation of segment extraction results with initial conditions. */
struct ExtractedSegment
......
......@@ -49,10 +49,10 @@ void BSWindow::setFile (QString fileName)
void BSWindow::runOptions ()
{
if (showIdet) detectionWidget->switchIdetAnalyzer ();
if (showProf) detectionWidget->switchProfileAnalyzer ();
// if (showAccu) detectionWidget->switchAccuAnalyzer ();
if (showSeg) detectionWidget->switchPixelAnalyzer ();
if (showIdet) detectionWidget->switchIdetAnalyzer (); // DEV
if (showProf) detectionWidget->switchProfileAnalyzer (); // DEV
// if (showAccu) detectionWidget->switchAccuAnalyzer (); // DEV
if (showSeg) detectionWidget->switchPixelAnalyzer (); // DEV
}
......@@ -64,10 +64,10 @@ void BSWindow::runTest ()
void BSWindow::closeEvent (QCloseEvent *event)
{
detectionWidget->closeIdetAnalyzer ();
detectionWidget->closeProfileAnalyzer ();
// detectionWidget->closeAccuAnalyzer ();
detectionWidget->closePixelAnalyzer ();
detectionWidget->closeIdetAnalyzer (); // DEV
detectionWidget->closeProfileAnalyzer (); // DEV
// detectionWidget->closeAccuAnalyzer (); // DEV
detectionWidget->closePixelAnalyzer (); // DEV
event->accept ();
}
......
......@@ -68,8 +68,8 @@ BSDetector::BSDetector ()
densityTestOn = true;
finalDensityTestOn = false;
finalLengthTestOn = false;
finalSpreadTestOn = true;
finalSpreadMin = 30;
finalSpreadTestOn = false;
finalSpreadMin = 10;
// nbSmallBS = 0;
multiSelection = false;
autodet = false;
......
......@@ -578,6 +578,12 @@ public:
*/
void incMaxDetections (bool dir);
/**
* \brief Sets the maximum number of detections in a multi-detection.
* @param nb Number of detections (0 if illimited).
*/
inline void setMaxDetections (int nb) { maxtrials = nb; }
/**
* \brief Resets the maximum number of detections set for a multi-detection.
*/
......
......@@ -200,3 +200,15 @@ void DigitalStraightSegment::dilate (int radius)
nu += 2 * radius;
c -= radius;
}
bool DigitalStraightSegment::contains (Pt2i p, int tol) const
{
int pos = a * p.x () + b * p.y ();
tol *= period ();
if (pos < c - tol || pos >= c + nu + tol) return (false);
if (a < (b < 0 ? -b : b))
return (p.x () >= min && p.x () <= max);
else
return (p.y () >= min && p.y () <= max);
}
......@@ -93,6 +93,13 @@ public:
*/
void dilate (int radius);
/**
* \brief Inquires if given point belongs to the segment with given tolerence.
* @param p Tested point.
* @param tol Count of naive lines tolerated outside.
*/
bool contains (Pt2i p, int tol) const;
protected:
......
#include <QApplication>
#include <string>
#include <cmath>
#include <cmath> // DEV
#include "bswindow.h"
#include "bsrandomtester.h"
// #include "scanwindow.h"
// #include "scanwindow.h" // DEV
int main (int argc, char *argv[])
{
int val = 0;
int imageName = 0;
bool random = false, testing = false, york = false;
bool random = false, testing = false;
bool york = false; // DEV
bool yt = false; // DEV
QApplication app (argc, argv);
// DEV IN
/*
if (argc == 2 && string (argv[1]) == string ("scans"))
{
......@@ -22,20 +25,28 @@ int main (int argc, char *argv[])
return app.exec ();
}
*/
// DEV OUT
BSWindow window (&val); // val : necessary argument !
for (int i = 1; i < argc; i++)
{
if (string(argv[i]).at(0) == '-')
{
if (string(argv[i]) == string ("-profile")) window.toggleProfWindow ();
// else if (string(argv[i]) == string ("-acc"))window.toggleAccuWindow ();
else if (string(argv[i]) == string ("-seg")) window.toggleSegWindow ();
else if (string(argv[i]) == string ("-idet")) window.toggleIdetWindow ();
// Test command : time ./Seg -test ../Images/couloir.jpg
if (string(argv[i]) == string ("-random")) random = true;
else if (string(argv[i]) == string ("-test")) testing = true;
else if (string(argv[i]) == string ("-random")) random = true;
// DEV IN
else if (string(argv[i]) == string ("-york")) york = true;
else if (string(argv[i]) == string ("-yt")) yt = true;
else if (string(argv[i]) == string ("-profile"))
window.toggleProfWindow ();
// else if (string(argv[i]) == string ("-acc"))
// window.toggleAccuWindow ();
else if (string(argv[i]) == string ("-seg"))
window.toggleSegWindow ();
else if (string(argv[i]) == string ("-idet"))
window.toggleIdetWindow ();
// Test command : time ./Seg -test ../Images/couloir.jpg
// DEV OUT
else if (string(argv[i]) == string ("-sobel3x3"))
window.useGradient (VMap::TYPE_SOBEL_3X3);
else if (string(argv[i]) == string ("-sobel5x5"))
......@@ -52,6 +63,7 @@ int main (int argc, char *argv[])
window.useGradient (VMap::TYPE_FULL_BLACK_HAT);
else if (string(argv[i]) == string ("-fullmorpho"))
window.useGradient (VMap::TYPE_FULL_MORPHO);
// DEV IN
else
{
int l = string (argv[i]).length ();
......@@ -64,6 +76,7 @@ int main (int argc, char *argv[])
else if (carac == 'i') window.toggleIdetWindow ();
}
}
// DEV OUT
}
else imageName = i;
}
......@@ -74,7 +87,8 @@ int main (int argc, char *argv[])
delete tester;
return (EXIT_SUCCESS);
}
if (york)
// DEV IN
else if (york)
{
QImage im;
im.load ("york.jpg");
......@@ -90,7 +104,7 @@ int main (int argc, char *argv[])
ExtLines yl ("yorklines.txt", width, height);
vector<BlurredSegment *> bss = detector.getBlurredSegments ();
double covFBSD = yl.covering (bss);
double covCL = yl.cannyLineCovering ("cannylines.txt", ncl, lcl, 30.);
double covCL = yl.cannyLineCovering ("cannylines.txt", ncl, lcl, 0.);
ofstream outf ("cmpcov.txt", ios::out);
outf << covCL << " " << covFBSD << endl;
outf.close ();
......@@ -114,10 +128,45 @@ int main (int argc, char *argv[])
outl.close ();
return (EXIT_SUCCESS);
}
else if (yt)
{
QImage im;
im.load ("york.jpg");
int width = im.width ();
int height = im.height ();
int **tabImage = new int*[height];
for (int i = 0; i < height; i++)
{
tabImage[i] = new int[width];
for(int j = 0; j < width; j++)
{
QColor c = QColor (im.pixel (j, height - i - 1));
tabImage[i][j] = c.value ();
}
}
BSDetectionWidget bsdw;
BSDetector detector;
clock_t start = clock ();
VMap *gMap = NULL;
for (int i = 0; i < 100; i++)
{
if (gMap != NULL) delete gMap;
gMap = new VMap (width, height, tabImage, VMap::TYPE_SOBEL_5X5);
detector.setGradientMap (gMap);
// buildGradientImage (0);
detector.detectAll ();
}
double diff = (clock () - start) / (double) CLOCKS_PER_SEC;
ofstream outf ("fbsdperf.txt", ios::out);
outf << diff << endl;
outf.close ();
return (EXIT_SUCCESS);
}
// DEV OUT
else
{
if (imageName != 0) window.setFile (QString (argv[imageName]));
else window.setFile (QString ("../couloir.gif"));
else window.setFile (QString ("Images/couloir.gif"));
if (testing)
{
window.runTest ();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment