You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 16 Next »

OpenCV kirjaston käyttö kannattaa yleensä aloittaa käymällä läpi OpenCV sivuston opetuskurssit. Nämä ovat erittäin hyvin ajantasalla, niiden käyttö on pyritty tekemään helpoksi ja ne on selostettu erittäin hyvin. Metropolian kirjaston tarjoaman SpringerLinkin kautta löytyy myös hyvä Practical OpenCV kirja, joka kannattaa ladata opiskelua varten.

Tällä sivustolla käsitellään kaikkein yksinkertaisimmat esimerkit kuten kuvan lataaminen ja muutamia suodattimia.

Lisäksi käydään läpi asioita, joille sivustolta ei löydy esimerkkejä kuten Qt käyttöliittymän hyödyntäminen ja erilaisten kameroiden käyttö OpenCV kanssa.

Kuvan lataaminen

Kuvan lataamiseen löytyy useita eri funktioista jotka löytyvät OpenCV dokumentaatiosta, nämä tehdään yleensä highgui luokalla. OpenCV käyttää Mat datatyyppiä kuville, se on matriisityyppinen datarakenne, jonne kuvat tallennetaan yleensä BGR väriformaatissa.

Kuvatiedosto

Kuvatiedoston lataaminen Mat muuttujaan.

Kamera ja video

Tekstiä videon ja kameran käytöstä opencv kanssa, webcam ja video on samaa.

Suodattimet

Yksinkertaisten suodattimien käyttöä

Häiriönpoisto

GaussianBlur yms...

Threshold

Morphology

Dilate, Erode, Open, Close

Kuvista tunnistaminen

HoughCircles, findContours käydään läpi ja linkitetään machine learning, findobjects ja features2d luokkien esimerkit. Ehkä liikkuva kuva.

Qt-käyttöliittymä

OpenCV käyttö on myös mahdollista Qt:lla tehdyissä käyttöliittymissä, tämä helpoittaa laadukkaan käyttöliittymän luomisessa. Joitakin asioita on kuitenkin otettava huomioon, kuten reaaliaikasen kuvan käsittely ja kuvan näyttäminen. OpenCV esimerkeissä reaaliaikaista kuvaa tai videota käsitellessä ohjelma jätetään pyörimään While looppiin, joka ei ole mahdollista Qt:n kanssa ja ohjelma kaatuu. 

Reaaliaikainen kuva

Qt:n kanssa reaaliaikaista voidaan kuitenkin käyttää QTimer ajastimella tai vaihtoehtoisesti aina kun kuva on käsitelty lähetetään signaali että ladataan uusi kuva. Seuraavassa esimerkissä on esitettynä kuinka QTimeria käytetään kuvan lukemiseen.

 timer=new QTimer(this); //timerin luonti
 connect(timer,SIGNAL(timeout()),this,SLOT(getFrame())); //Timerin timeout signaalin yhdistäminen uuden kuvan lukemiseen
 timer->start(50);//Ajastimen käynnistys ja timeout() viive millisekunteina

Kuvan näyttäminen

Kuvan voidaan näyttää Qt käyttöliittymässä lukemalla kuva OpenCV:n Mat datasta kuva QImage muotoon, jolloin kuva voidaan piirtää Qt-käyttöliittymään. OpenCV lataa kuvat oletuksena BGR väriformaatilla, kun Qt taas käyttää oletuksena RGB väriformaattia. Kuva tulee muuttaa RGB muotoon, jotta se näkyy oikein. Seuraavassa esimerkkikoodissa on esitettynä kuvan lukeminen Mat datasta QImage dataan.

 cv::Mat _image=imread("esimerkki.jpg");
 QImage qimg;
 if(_image.channels()==1) //Katsotaan kuvakanavien määrä, harmaasävy kuvassa 1 ja RGB 3.
 {
 qimg = QImage((uchar*)_image.data,_image.cols,_image.rows,_image.step,QImage::Format_Indexed8); 
 //Kuvan luetaan QImage muotoon, formaatti (*data,width,height,bytesperline,format)
 }
 else if(_image.channels()==3)
 {
 cv::cvtColor(_image,_image,CV_BGR2RGB);
 //Muunnetaan kuva Qt:n käyttämään RGB väriformaattiin.
 qimg = QImage((uchar*)_image.data,_image.cols,_image.rows,_image.step,QImage::Format_RGB888);
 }

Kuvan näyttämiseen käyttöliittymässä voidaan käyttää esimerkiksi QGraphicsView tai label widgettiä. Seuraavassa esimerkkikoodissa on yksinkertaisemman label widgetin käyttö.

 ui->imgLabel->setPixmap(QPixmap::fromImage(img));
 //Kuvan piirto label widgetiin.

GraphicsView taas on vähän monipuolisempi widget jossa pystytään esittämään 2D kuvaa, siitä pystyy valitsemaan kuva-alueita ja vierittämään suurempiakin kuvia joten sen käyttö on usein suositeltavaa. Sille täytyy ohjelmassa esittää QGraphicsScene, johon kuva päivitetään. GraphicsView seuraa kokoajan scenen muutoksia, joten riittää kuin sceneen päivittää tämän jälkeen uuden kuvan nii se näkyy ruudulla.

 scene=new QGraphicsScene(); //Luodaan QGraphicsScene
 ui->graphicsView->setScene(scene); //Asetetaan scene graphicsView widgettiin
 scene->addPixmap(QPixmap::fromImage(qimg)); //Piirretään kuva sceneen, tätä käytetään myös kuvan päivittämiseen.
  • No labels
You must log in to comment.