changemask.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "changemask.h"
  2. #include "ui_changemask.h"
  3. #include <QPainter>
  4. #include <QPolygon>
  5. #include <QMouseEvent>
  6. #include <QToolButton>
  7. // Erstellt den Dialog
  8. // m: Die Maske, welche editiert werden soll
  9. // cam: Die Kamera, zu welcher die Maske gehört
  10. // parent: Der Eltern QWidget von Qt
  11. ChangeMask::ChangeMask( Mask *m, Kamera *cam, QWidget *parent ) :
  12. QDialog(parent),
  13. ui(new Ui::ChangeMask),
  14. cam( cam )
  15. {
  16. ui->setupUi(this);
  17. setWindowTitle( "Maske von " + cam->getName() );
  18. Frame *f = cam->getFrame( 0 );
  19. m->loadMask();
  20. if( m->getMask()->isNull() )
  21. m->createMask( f->getImage().size() );
  22. view = new ChangeMaskView( f->getImage(), m->getMask(), ui->widget );
  23. }
  24. ChangeMask::~ChangeMask()
  25. {
  26. delete ui;
  27. delete view;
  28. }
  29. // Setzt die Farbe zukünftiger Polygone auf schwarz
  30. void ChangeMask::on_black_clicked()
  31. {
  32. ui->black->setChecked( true );
  33. ui->white->setChecked( false );
  34. view->setBlack( true );
  35. }
  36. // Setzt die Farbe zukünftiger Polygone auf Weiß
  37. void ChangeMask::on_white_clicked()
  38. {
  39. ui->white->setChecked( true );
  40. ui->black->setChecked( false );
  41. view->setBlack( false );
  42. }
  43. // Bricht das Ändern der Maske ab ohne sie zu speichern
  44. void ChangeMask::on_abort_clicked()
  45. {
  46. this->close();
  47. }
  48. // Beendet das Ändern der Maske und speichert sie
  49. void ChangeMask::on_save_clicked()
  50. {
  51. this->close();
  52. cam->saveMask();
  53. }
  54. // Inhalt der ChangeMaskView Klasse
  55. //----------------------------------
  56. // Erstellt die Ansicht
  57. // background: Ein Bild der Kamera, zu der die Maske editiert werden soll
  58. // mask: Das Schwarz-Weiß Bild, welches die momentane Maske darstellt
  59. // parent: Der Eltern QWidget von Qt
  60. ChangeMaskView::ChangeMaskView(QImage background, QImage *mask,QWidget *parent)
  61. : QWidget( parent ),
  62. background( background ),
  63. mask( mask ),
  64. xScaleFactor( 1 ),
  65. yScaleFactor( 1 ),
  66. black( true )
  67. {
  68. parent->layout()->addWidget( this );
  69. this->setMouseTracking( true );
  70. }
  71. ChangeMaskView::~ChangeMaskView()
  72. {}
  73. // Wandelt einen Punkt aus Bildkoordinaten in Bildschirmkoordinaten um
  74. QPoint ChangeMaskView::translate( QPoint p )
  75. {
  76. return QPoint( (int)(p.x() * xScaleFactor + 20), (int)(p.y() * yScaleFactor + 20) );
  77. }
  78. // Wandelt einen Punkt aus Bildschirmkoordinaten in Bildkoordinaten um
  79. QPoint ChangeMaskView::inverseTranslate( QPoint p )
  80. {
  81. return QPoint( (int)((p.x()-20) / xScaleFactor), (int)((p.y()-20) / yScaleFactor) );
  82. }
  83. // Setzt die Zeichenfarbe
  84. // black: Falls 0 wird in Zukunft mit weiß gezeichnet, andernfalls mit
  85. // schwarz
  86. void ChangeMaskView::setBlack( bool black )
  87. {
  88. this->black = black;
  89. }
  90. // Zeichnet die Ansicht (wird automatisch vom Qt Framework aufgerufen)
  91. void ChangeMaskView::paintEvent(QPaintEvent *e)
  92. {
  93. QSize s = size() - QSize( 40, 40 );
  94. QRect imgRect( QPoint( 20, 20 ), s );
  95. QSize imgS = background.size();
  96. if( imgS.width() > s.width() )
  97. {
  98. imgS.scale( s, Qt::KeepAspectRatio );
  99. imgRect.setSize( imgS );
  100. }
  101. // Aktualisiere die Skallierungs Faktoren
  102. xScaleFactor = imgRect.width() / (float)background.width();
  103. yScaleFactor = imgRect.height() / (float)background.height();
  104. QPainter painter( this );
  105. // Zeichne Hintergrundbild un Maske
  106. painter.drawImage( QRect( translate( QPoint( 0, 0 ) ), translate( QPoint( background.width(), background.height() ) ) ), background );
  107. painter.setOpacity( 0.75 );
  108. painter.drawImage( QRect( translate( QPoint( 0, 0 ) ), translate( QPoint( mask->width(), mask->height() ) ) ), *mask );
  109. painter.setOpacity( 1 );
  110. painter.setPen( QPen( QColor( 0, 255, 0 ), 2, Qt::DotLine ) );
  111. if( polygon.size() == 0 )
  112. painter.drawEllipse( (int)(mousePos.x()) - 2, (int)(mousePos.y()) - 2, 5, 5 );
  113. else
  114. { // Zeichne das aktuelle Polygon
  115. for( auto p = polygon.begin(); p != polygon.end() - 1; p++ )
  116. painter.drawLine( translate( *p ), translate( *(p + 1) ) );
  117. if( inverseTranslate( mousePos ).x() > polygon.begin()->x() - 30 && inverseTranslate( mousePos ).x() < polygon.begin()->x() + 30 &&
  118. inverseTranslate( mousePos ).y() > polygon.begin()->y() - 30 && inverseTranslate( mousePos ).y() < polygon.begin()->y() + 30 )
  119. {
  120. painter.drawLine( translate( *polygon.begin() ), translate( *(polygon.end() - 1) ) );
  121. }
  122. else
  123. {
  124. painter.drawLine( translate( *polygon.begin() ), mousePos );
  125. painter.drawLine( mousePos, translate( *(polygon.end() - 1) ) );
  126. painter.drawEllipse( (int)(mousePos.x()) - 2, (int)(mousePos.y()) - 2, 5, 5 );
  127. }
  128. }
  129. }
  130. // Verarbeitet Maus Bewegungen (wird automatisch vom Qt Framework
  131. // aufgerufen)
  132. void ChangeMaskView::mouseMoveEvent( QMouseEvent *e )
  133. {
  134. mousePos = e->pos();
  135. repaint();
  136. }
  137. // Verarbeitet Maus Tastendrücke (wird automatisch vom Qt Framework
  138. // aufgerufen)
  139. void ChangeMaskView::mouseReleaseEvent( QMouseEvent *e )
  140. {
  141. QPoint pos = inverseTranslate( e->pos() );
  142. if( pos.x() > polygon.begin()->x() - 30 && pos.x() < polygon.begin()->x() + 30 &&
  143. pos.y() > polygon.begin()->y() - 30 && pos.y() < polygon.begin()->y() + 30 )
  144. {
  145. QPainter painter;
  146. painter.begin( mask );
  147. if( black )
  148. {
  149. painter.setBrush( QBrush( QColor( 0, 0, 0 ), Qt::SolidPattern ) );
  150. painter.setPen( QPen( QColor( 0, 0, 0 ) ) );
  151. }
  152. else
  153. {
  154. painter.setBrush( QBrush( QColor( 255, 255, 255), Qt::SolidPattern ) );
  155. painter.setPen( QPen( QColor( 255, 255, 255 ) ) );
  156. }
  157. painter.drawPolygon( polygon );
  158. polygon.clear();
  159. }
  160. else
  161. polygon.append( pos );
  162. repaint();
  163. }