117 lines
3.4 KiB
C++
117 lines
3.4 KiB
C++
#include "cvimageviewer.h"
|
|
#include <QPicture>
|
|
#include <QDebug>
|
|
#include <QMouseEvent>
|
|
#include <QFileDialog>
|
|
#include <opencv2/imgcodecs.hpp>
|
|
|
|
CvImageViewer::CvImageViewer(QWidget *parent, size_t lastId) :
|
|
QWidget(parent),
|
|
lastId_(lastId),
|
|
saveAction_("Save Image", nullptr)
|
|
{
|
|
connect(&saveAction_, &QAction::triggered, this, &CvImageViewer::saveImage);
|
|
qimage_.load(":/images/noimage.png");
|
|
|
|
imageContextMenu_.addAction(&saveAction_);
|
|
}
|
|
|
|
CvImageViewer::~CvImageViewer()
|
|
{
|
|
}
|
|
|
|
void CvImageViewer::saveImage()
|
|
{
|
|
QString fileName;
|
|
if(origImage_.type() == CV_8UC3 || origImage_.type() == CV_8SC3 || origImage_.type() == CV_8UC1 || origImage_.type() == CV_8SC1)
|
|
{
|
|
fileName = QFileDialog::getSaveFileName(this, "Save Image", "./", "*.mat *.png" );
|
|
}
|
|
else
|
|
{
|
|
fileName = QFileDialog::getSaveFileName(this, "Save Image", "./", "*.mat" );
|
|
}
|
|
if(!fileName.isEmpty())
|
|
{
|
|
QStringList tokens = fileName.split('.');
|
|
if(tokens.back() != "mat" && tokens.back() != "png")
|
|
fileName.append(".mat");
|
|
tokens = fileName.split('.');
|
|
if(tokens.back() == "png")
|
|
{
|
|
imwrite(fileName.toStdString(), origImage_);
|
|
}
|
|
else
|
|
{
|
|
cv::FileStorage matf(fileName.toStdString(), cv::FileStorage::WRITE);
|
|
matf<<"image"<<origImage_;
|
|
matf.release();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CvImageViewer::setImage(Camera::Image img)
|
|
{
|
|
image_ = img.mat;
|
|
origImage_=img.mat;
|
|
qDebug()<<"viwer got"<<image_.rows<<'x'<<image_.cols<<" type "<<image_.type()<<"image from camera"<<img.cameraId;
|
|
if(image_.type() == CV_8UC3 || image_.type() == CV_8SC3)
|
|
{
|
|
qimage_ = QImage(image_.data, image_.cols, image_.rows, image_.step, QImage::Format_RGB888);
|
|
}
|
|
else if(image_.type() == CV_8UC1 || image_.type() == CV_8SC1)
|
|
{
|
|
qimage_ = QImage(image_.data, image_.cols, image_.rows, image_.step, QImage::Format_Grayscale8);
|
|
}
|
|
else if(image_.type() == CV_32FC1 || image_.type() == CV_64FC1)
|
|
{
|
|
img.mat.convertTo(image_, CV_8UC1, 255, 0);
|
|
qimage_ = QImage(image_.data, image_.cols, image_.rows, image_.step, QImage::Format_Grayscale8);
|
|
}
|
|
else
|
|
{
|
|
img.mat.convertTo(image_, CV_8UC1, 255, 0);
|
|
qimage_ = QImage(image_.data, image_.cols, image_.rows, image_.step, QImage::Format_Grayscale8);
|
|
}
|
|
update();
|
|
}
|
|
|
|
void CvImageViewer::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
if(event->button() == Qt::RightButton)
|
|
{
|
|
saveAction_.setEnabled(origImage_.data);
|
|
imageContextMenu_.popup(event->globalPos());
|
|
}
|
|
else if(origImage_.data && event->x() > imgrect_.x() && event->y() > imgrect_.y() && event->x() < imgrect_.x()+imgrect_.width() && event->y() < imgrect_.y()+imgrect_.height())
|
|
{
|
|
int x = (event->x()-imgrect_.x())/static_cast<double>(imgrect_.width())*origImage_.cols;
|
|
int y = (event->y()-imgrect_.y())/static_cast<double>(imgrect_.height())*origImage_.rows;
|
|
qDebug()<<x<<y;
|
|
if(origImage_.type() == CV_32FC1)
|
|
{
|
|
if(x >= 0 && y >= 0 && x <= origImage_.cols && y < origImage_.rows)
|
|
sigValue(x, y, origImage_.at<float>(y,x));
|
|
}
|
|
else
|
|
{
|
|
|
|
sigValue(x, y, 0);
|
|
}
|
|
}
|
|
QWidget::mousePressEvent(event);
|
|
}
|
|
|
|
void CvImageViewer::paintEvent(QPaintEvent* event)
|
|
{
|
|
Q_UNUSED(event)
|
|
QPainter painter(this);
|
|
|
|
double ratio = qimage_.size().height() / (double)qimage_.size().width();
|
|
if(rect().width()*ratio <= rect().height())
|
|
imgrect_.setRect(0, (rect().height()-rect().width()*ratio)/2, rect().width(), rect().width()*ratio);
|
|
else
|
|
imgrect_.setRect((rect().width()-rect().height()/ratio)/2, 0, rect().height()/ratio, rect().height());
|
|
painter.drawImage(imgrect_, qimage_);
|
|
}
|