Ympyröiden tunnistus Qt5.6 -ohjelmistolla käyttäen OpenCV-kirjastoa. Lisäksi eroosion ja dilaation lisääminen kuvaan. Avaa Qt ja tee uusi widget-projekti. Muista valita debuggeriksi Visual Studio 2013.
Tässä mainwindow.h -tiedosto.
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>
using namespace cv;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Mat img, gray;
private slots:
void on_pBYmpyra_clicked();
void on_pBDilaatio_clicked();
void on_pBEroosio_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Tässä pääfunktion tiedosto main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Seuraavana itse ohjelma, mainwindow.cpp -tiedosto.
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <iostream>
using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pBYmpyra_clicked()
{
string imageName("C:\\konenako\\measurement004.bmp");
QMessageBox msgBox;
msgBox.setText("Kuvaa ei löydy.");
img = imread(imageName.c_str());
if( !img.data )
{
msgBox.exec();
return;
}
cvtColor(img, gray, COLOR_BGR2GRAY);
GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
vector<Vec3f> circles;
HoughCircles(gray, circles, HOUGH_GRADIENT, 2, gray.rows/100, 20, 70, 10,50 );
for( size_t i = 0; i < circles.size(); i++ )
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle( gray, center, 3, Scalar(0,255,0), -1, 8, 0 );
circle( gray, center, radius, Scalar(0,0,255), 3, 8, 0 );
}
namedWindow( "Ympyrät", 1 );
imshow( "Ympyrät", gray );
}
Yllä olevassa on_pBYmpyra_clicked()-funktiossa aluksi avataan kuva halutusta polusta. Seuraavaksi tallennetaan kuva img -nimiseen matriisiin. Jos kuvaa ei löydy ohjelma antaa siitä ilmoituksen msgBox:n avulla. Kun kuvan avaaminen onnistuu, muutetaan kuva harmaasävyksi ja blurrataan sitä tulosten parantamiseksi. Seuraavaksi kuvaan tehdään HoughCircles-muunnos, joka etsii kaikki ympyrät kuvasta, kaksi viimeistä parametria päättävät minkä kokoisia ympyröitä etsitään.
For -loopissa löydetyt ympyrät piirretään kuvaan ja lopuksi kuva näytetään ikkunassa ”Ympyrät”.
void MainWindow::on_pBDilaatio_clicked()
{
string imageName("C:\\konenako\\measurement004.bmp");
QMessageBox msgBox;
msgBox.setText("Kuvaa ei löydy.");
img = imread(imageName.c_str());
if( !img.data )
{
msgBox.exec();
return;
}
cvtColor(img, gray, COLOR_BGR2GRAY);
GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
dilate(gray, gray, Mat(), Point(-1,-1), 20, BORDER_CONSTANT, 1);
namedWindow( "Dilaatio demo", 1 );
imshow( "Dilaatio demo", gray );
}
on_pBDilaatio_clicked()-funktiossa haluttuun kuvaan lisätään dilaatio-muunnos. Ensiksi tehdään samat kuvamuutokset kuin edellä ja sitten lisätään dilaatio kuvaan. Dilaation voimakkuutta voidaan muuttaa vaihtamalla kolmanneksi viimeistä parametria dilate-funktiosta. Arvo kertoo kuinka monta kertaa dilaatio kuvaan tehdään.
void MainWindow::on_pBEroosio_clicked()
{
string imageName("C:\\konenako\\measurement004.bmp");
QMessageBox msgBox;
msgBox.setText("Kuvaa ei löydy.");
img = imread(imageName.c_str());
if( !img.data )
{
msgBox.exec();
return;
}
cvtColor(img, gray, COLOR_BGR2GRAY);
GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
erode(gray, gray, Mat(), Point(-1,-1), 20, BORDER_CONSTANT, 1);
namedWindow( "Eroosio demo", 1 );
imshow( "Eroosio demo", gray );
}
Viimeinen funktio on_pBEroosio_clicked(). Se tekee kuvaan dilaation vastakohdan eli eroosion. Erode funktion parametrit ovat samat kuin dilate-funktiolla eli kolmanneksi viimeisin parametri määrää eroosion voimakkuuden. Muuten koodi vastaa dilate-funktion koodia.
Käyttöliittymä koostuu kolmesta eri painikkeesta, jotka aktivoivat niitä vastaavat funktiot.
Jos haluat testata ohjelmaa käyttäen web-kameraa kuvan lähteenä, lisää seuraava koodin pätkä mainwindow.cpp- tiedostossa sijaitseviin funktioihin, kuvan hakemispolun päälle.
VideoCapture cap(0); // open the default camera
if(!cap.isOpened())
{ // check if we succeeded
msgBox.setText("Kameraa ei kytketty.");
msgBox.exec();
return;
}
cap >> img;
Koodi toimii siten että ensin avataan videoportti ja tutkitaan onko tietokoneeseen kytkettynä kameraa. Kun kamera löytyy, otetaan kameralta yksi kuva ja tallennetaan se img-matriisiin.
Koodin pitäisi näyttää seuraavalta. Esimerkki tehty Dilaatio-funktioon.
void MainWindow::on_pBDilaatio_clicked()
{
/*string imageName("C:\\konenako\\measurement004.bmp");
QMessageBox msgBox;
msgBox.setText("Kuvaa ei löydy.");
img = imread(imageName.c_str());
if( !img.data )
{
msgBox.exec();
return;
}
*/
VideoCapture cap(0); // open the default camera
if(!cap.isOpened())
{ // check if we succeeded
msgBox.setText("Kameraa ei kytketty.");
msgBox.exec();
return;
}
cap >> img;
cvtColor(img, gray, COLOR_BGR2GRAY);
GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
dilate(gray, gray, Mat(), Point(-1,-1), 20, BORDER_CONSTANT, 1);
namedWindow( "Dilaatio demo", 1 );
imshow( "Dilaatio demo", gray );
}