読者です 読者をやめる 読者になる 読者になる

QtでOpenCVを使う

OpenCV

Qtで画像を扱うにはQImageを使うけど、簡単な機能しか付いていないのでOpenCVを使いたい。というわけで、OpenCV 2.2をインストールした。(QtとEigenが2.2から使える?)

グレースケール化

グレースケール化と書いてあるボタンを押したら、グレースケール化をするプログラムを作る。
デザインはこんな感じ。

ボタンはGo to slotでスロットを設定する。
OpenCVを使うために、LIBS += -lopencv_core -lopencv_highgui -lopencv_imgprocとしておく。他の機能を使う場合は適宜追加する。
そんなわけで、ソースは以下の通り。
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <QImage>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 元画像の表示
    cv::Mat color_image = cv::imread("Parrots.bmp");
    QImage image(color_image.data, 
                 color_image.cols, color_image.rows, 
                 QImage::Format_RGB888);
    image = image.rgbSwapped();
    ui->label->setPixmap(QPixmap::fromImage(image));
}

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

// グレースケール化
void Widget::on_pushButton_clicked()
{
    cv::Mat color_image = cv::imread("Parrots.bmp");
    cv::Mat gray_image;
    cv::cvtColor(color_image, gray_image, CV_BGR2GRAY); // BGR?
    QImage image(gray_image.data, 
                 gray_image.cols, 
                 gray_image.rows, 
                 QImage::Format_Indexed8);
    image = image.convertToFormat(QImage::Format_RGB32);
    ui->label->setPixmap(QPixmap::fromImage(image));
}

これを動かした結果

のボタンを押すと

となる。