Ohjeet Qt- projektin tekemiseen, jossa luetaan kuva tiedostosta opencv Mat tyypiksi ja muutetaan se Qt:n QImage-tyypiksi sekä näytetään se dialogissa.

Jotta harjoituksen tekeminen onnistuu, pitää OpenCv kirjasto (paketti libopencv-dev) olla asennettu koneeseen. Ubuntussa se käy helposti Synapticilla.

Synapticin asentaminen
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install synaptic

(Vaihtoehtoisesti voit asentaa myös libopencv-dev:n vastaavalla apt-get install -käskyllä.)

Projekti luodaan oletusasetuksilla vaihtaen QMainWindow QDialog luokaksi

Alla näkyy muutokset projektitiedostoon

QtJaOpenCv1.pro
#-------------------------------------------------
#
# Project created by QtCreator 2013-12-12T11:23:59
#
#-------------------------------------------------
QT       += core gui
TARGET = quiJaCv2
TEMPLATE = app
SOURCES += main.cpp\
        dialog.cpp
HEADERS  += dialog.h
FORMS    += dialog.ui
# lisää alla olevat rivit ja tarkasta polut
INCLUDEPATH += /usr/include/opencv2 #katso, että nämä löytyvät ko. hakemistosta
LIBS += /usr/lib/libopencv_core.so
LIBS += /usr/lib/libopencv_highgui.so
LIBS += /usr/lib/libopencv_imgproc.so

Seuraavana muokataan otsikkotiedostoa, polkujen kanssa kannattaa olla tarkkana ja tarkastaa tiedostojen olemassaolo päänsäryn välttämiseksi.

Dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QImage>
#include <QPainter>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
    
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    QSize sizeHint() const { return _qimage.size(); }
    QSize minimumSizeHint() const { return _qimage.size(); }
public slots:
    QImage Mat2QImage(cv::Mat const& src);
    void showImage(const cv::Mat& image);
protected:
    void paintEvent(QPaintEvent* /*event*/);
    QImage _qimage;
    cv::Mat _tmp;
private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

Vielä muokkaame Dialog.cpp tiedostoa, jotta kuva saadaan näkymään.  Lisätään vielä suoritettavan ohjelman hakemistoon haluttu kuva. (max 640*480, jotta mahtuu dialogiin)

Dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    cv::Mat img = cv::imread("kuva.jpg");
    showImage(img);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::showImage(const cv::Mat& image) {

    // Convert the image to the RGB888 format
    switch (image.type()) {
    case CV_8UC1:
        cvtColor(image, _tmp, CV_GRAY2RGB);
        break;
    case CV_8UC3:
        cvtColor(image, _tmp, CV_BGR2RGB);
        break;
    }

    // QImage vaatii, että data on yhtenä palana muistissa
    assert(_tmp.isContinuous());
    // Assign OpenCV's image buffer to the QImage. Note that the bytesPerLine parameter
    // (http://qt-project.org/doc/qt-4.8/qimage.html#QImage-6) is 3*width because each pixel
    // has three bytes.
    _qimage = QImage(_tmp.data, _tmp.cols, _tmp.rows, _tmp.cols*3, QImage::Format_RGB888);

    this->setFixedSize(image.cols, image.rows);

    repaint();
}

void Dialog::paintEvent(QPaintEvent* /*event*/) {
    QPainter painter(this);//ui->graphicsView);
    painter.drawImage(QPoint(0,0), _qimage);
    painter.end();
}
//funktio muuttaa opencv Mat tyypin kuvan QImage-muotoon 
QImage Dialog::Mat2QImage(cv::Mat const& src)
{
     cv::Mat temp(src.cols,src.rows,src.type());
     cvtColor(src, temp,CV_BGR2RGB);
     QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
     return dest;
}

 

 

  • No labels
You must log in to comment.