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.
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
#------------------------------------------------- # # 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.
#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)
#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; }