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 );

}

  • No labels
You must log in to comment.