128 lines
2.1 KiB
C++
128 lines
2.1 KiB
C++
#include <opencv2/core.hpp>
|
|
#include <opencv2/imgproc.hpp>
|
|
|
|
#include <QtDebug>
|
|
#include <QMouseEvent>
|
|
|
|
#include "cast.h"
|
|
#include "painter.h"
|
|
#include "filterlist.h"
|
|
#include "viewer.h"
|
|
#include "camera.h"
|
|
|
|
using namespace cv;
|
|
|
|
extern Camera *cam;
|
|
extern FilterList *filters;
|
|
|
|
Viewer::Viewer(QWidget *parent) :
|
|
QGLWidget(parent),
|
|
img(NULL)
|
|
{ }
|
|
|
|
void Viewer::resizeEvent(QResizeEvent *)
|
|
{
|
|
updateViewport();
|
|
}
|
|
|
|
void Viewer::paintEvent(QPaintEvent *)
|
|
{
|
|
Painter p(this, 1 / ratio);
|
|
|
|
p.fillRect(rect(), Qt::black);
|
|
|
|
if (!img)
|
|
return;
|
|
|
|
p.setViewport(viewport);
|
|
p.setWindow(qimg.rect());
|
|
|
|
p.drawImage(p.window(), qimg);
|
|
|
|
QPen pen = p.pen();
|
|
pen.setColor(Qt::green);
|
|
pen.setWidth(2 / ratio);
|
|
p.setPen(pen);
|
|
|
|
for (auto filter : *filters) {
|
|
Result *result = img->getResult(filter);
|
|
|
|
if (filter->isShown() && result)
|
|
result->draw(&p);
|
|
}
|
|
}
|
|
|
|
void Viewer::mouseReleaseEvent(QMouseEvent *me)
|
|
{
|
|
if (viewport.contains(me->pos())) {
|
|
QPoint pos = transformInv(me->pos());
|
|
|
|
qDebug() << "Clicked at: " << pos.x() << "," << pos.y();
|
|
|
|
clicks.push_back(Point(pos.x(), pos.y()));
|
|
emit clicked(pos);
|
|
}
|
|
}
|
|
|
|
QPoint Viewer::transform(QPoint pos)
|
|
{
|
|
return pos * ratio + viewport.topLeft();
|
|
}
|
|
|
|
QPoint Viewer::transformInv(QPoint pos)
|
|
{
|
|
return (pos - viewport.topLeft()) / ratio;
|
|
}
|
|
|
|
void Viewer::showImage(Image *next)
|
|
{
|
|
if (!next)
|
|
return;
|
|
|
|
if (next != img)
|
|
filters->reset();
|
|
|
|
img = next;
|
|
updateImage();
|
|
}
|
|
|
|
void Viewer::updateImage()
|
|
{
|
|
if (!img)
|
|
return;
|
|
|
|
filters->execute(img);
|
|
|
|
qimg = toQImage(img->filtered);
|
|
|
|
if (size != img->filtered.size()) {
|
|
size = img->filtered.size();
|
|
updateViewport();
|
|
}
|
|
|
|
update();
|
|
}
|
|
|
|
void Viewer::updateViewport()
|
|
{
|
|
double viewRatio = (double) size.width / size.height;
|
|
|
|
int viewHeight = width() / viewRatio;
|
|
int viewWidth = width();
|
|
|
|
if (viewHeight > height()) {
|
|
viewWidth = height() * viewRatio;
|
|
viewHeight = height();
|
|
}
|
|
|
|
viewport = QRect(
|
|
(width() - viewWidth) / 2,
|
|
(height() - viewHeight) / 2,
|
|
viewWidth,
|
|
viewHeight
|
|
);
|
|
|
|
qDebug() << "New viewport" << viewport << " in widget " << rect() << " for frame " << toQt(size);
|
|
|
|
ratio = (double) viewport.width() / size.width;
|
|
}
|