Tracking warna berdasarkan besarnya contours dan pengaplikasian moments - OpenCV

Postingan ini akan membahas tentang tracking warna di OpenCV. Sederhananya sih gitu.... Komponen yang digunakan adalah pengaplikasian findcontours dan moments. Dua hal tadi adalah wajib. findcotours digunakan untuk mendapatkan kontur pada seleksi warna HSV yang telah dilakukan. Kalau belum ngerti seleksi warna HSV, bisa dilihat postingan lama saya terdahulu di sini. moments digunakan untuk mencari titik beban (titik 0) pada sebuah kontur yang telah didapatkan. Untuk lebih cepatnya, seperti biasa hehehe langsung mencoba codingan saya saja. :)

Hasilnya kurang lebih seperti ini:

Codingan dari gambar diatas seperti ini:


#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <opencv2/core/core.hpp>

using namespace cv;
using namespace std;

int main()
{
    VideoCapture cap(0);
    if(!cap.isOpened())
    return -1;

    cap.set(CV_CAP_PROP_FRAME_WIDTH,320);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,240);
    namedWindow("camera");
    namedWindow("HSV");
    Mat frame, imgHsv;
    int h_min = 3, h_max = 27, s_min = 85, s_max = 167, v_min = 107, v_max = 207; //hitam

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    while (true)

     {

     cap>>frame;

     Point CoordA;

     cvtColor(frame,imgHsv,CV_BGR2HSV);

     inRange(imgHsv,Scalar(h_min,s_min,v_min),Scalar(h_max,s_max,v_max),imgHsv);
     createTrackbar("H_MIN: ","HSV",&h_min,255);
     createTrackbar("H_MAX: ","HSV",&h_max,255);
     createTrackbar("S_MIN: ","HSV",&s_min,255);
     createTrackbar("S_MAX: ","HSV",&s_max,255);
     createTrackbar("V_MIN: ","HSV",&v_min,255);
     createTrackbar("V_MAX: ","HSV",&v_max,255);

     findContours(imgHsv.clone(), contours, hierarchy, CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE, Point(0,0));
     for (unsigned int i = 0; i < contours.size(); i++) {
             float area = contourArea(contours[i]);
             if (area > 200) {
                 Moments mm = moments(contours[i], false);
                 double moment10 = mm.m10;
                 double moment01 = mm.m01;
                 double moment00 = mm.m00;
                 //Point CoordA;
                 CoordA.x = int(moment10 / moment00);
                 CoordA.y = int(moment01 / moment00);
                 Point2f center(CoordA.x, CoordA.y); // point in center (x only)
                 circle(frame, center, 5, Scalar(0, 0, 255), -1, 8, 0);
                 circle(frame, center, 20.0, Scalar( 0, 255, 0 ), 1, 8 );
             }
          }



     imshow("camera",frame);
     imshow("HSV",imgHsv);

     if(waitKey(20) != -1)

         break;

         }


    return 0;
}
Panjang ya? Emang! hehehe
Tapi coba pelajari pelan2 kalau masih belum ngerti. Kalo gampang sih coba di execute kode diatas, kemudian di otak atik sendiri. Jadi program diatas adalah untuk tracking flashdisk saya yang berwarna oranye. Bagaimana jika anda ingin tracking warna lain? mudah, yaitu lakukan pengaturan HSV pada trackbar yang saya buat, jngan lupa, warna yang terseleksi adalah warna putih pada frame HSV (berarti terdeteksi sebagai "1").
Selanjutnya, pada baris
if (area > 200) {
yang saya maksud adalah moments akan diproses jika area kontur yang didapat adalah lebih dari 200 pixel, sehingga jika pixel kontur yang ditangkap kurang dari 200 pixel, maka tidak akan terjadi pemrosesan moments. Untuk mengurangi adanya noise pada seleksi HSV, bisa anda gunakan metode erode dan dilate, bisa anda baca di sini.

Sudah dulu ya, dicoba saja sambil di otak-atik. Nanti ngerti sendiri kok :)

Related Posts:

0 Response to "Tracking warna berdasarkan besarnya contours dan pengaplikasian moments - OpenCV"