AGENDA
Tutorials - OpenCV
Latihan 9 : Mengontrol Bola Dengan OpenCV

Pada pembahasan kali ini, kita akan menggunakan objek lingkaran sebagai objek dasar Pengontrolan Bola.



Mengontrol Bola Dengan OpenCV

Pada pembahasan kali ini, kita akan menggunakan objek lingkaran sebagai objek dasar Pengontrolan Bola. Seperti yang telah di jelaskan pada bab sebelumnya berikut ini adalah langkah-langkah untuk membuat objek lingkaran menggunakan OpenCV.

1) Pertama-tama buka aplikasi Microsoft Visual  Studio 2012  yang sudah terintall sebelumnya. Kemudian buatlah New Project dengan cara : Pilih file » New » New Project, seperti gambar berikut :

2) Lalu akan muncul jendela New Project pilihlah » Visual C++ » Win32 Console Application kemudian beri nama project “mengontrolBolaDenganOpenCv” dan tentukan lokasi penyimpanannya » Klik Ok, seperti gambar berikut :

3) Kemudian akan muncul jendela Win32 Application Wizard – mengontrolBolaDenganOpenCv » Klik Next

4) Lalu pilihlah Console Application dan cheklistlah Empty Project » Klik Finish


5) Lalu akan muncul jendela mengontrolBolaDenganOpenCv - Microsoft Visual Studio lalu klik kanan pada nama project yang anda buat, pilihlah Add » New Item.

6) Kemudian akan muncul jendela Add New Item – mengontrolBolaDenganOpenCv,pilihlah Visual C++ » C++ File (.cpp) » beri nama “mengontrolBolaDenganOpenCv” » tentukan lokasi penyimpanan »klik Add

7) Kemudian lakukan konfigurasi openCV pada Microsoft Visual Studio 2012. Langkah-langkah untuk melakukan konfigurasi pada Microsoft Visual Studio dapat dilihat pada bahasan sebelumnya.

8) Setelah itu masukan Codding berikut ini :

//Nama Program	       : mengontrolBolaDenganOpenCv.cpp
//Tanggal              : Februari 2015
//Deskripsi	       : Mengontrol bola dengan OpenCv

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/opencv_modules.hpp"
#include "math.h"
#include "opencv\cv.h" 
#include "opencv\highgui.h" 

IplImage* imgTracking;// Menggunakan Iplimage
int lastX = -1; 
// Posisi pertama bola untuk sumbu x , dari sebelum bola masuk ke pusat
int lastY = -1; 
// Posisi pertama bola untuk sumbu y , dari sebelum bola masuk ke pusat

using namespace std;
using namespace cv;

// Mendeklarasikan fungsi dan variabel

void MyFilledCircle( Mat img, Point center ); 
// Fungsi untuk membuat lingkaran ,
void drawImage(char windowName[], Mat matrix); 
// create a window and draw the circle in the window
void moveCircleTo(int x, int y); 
// Fungsi untuk memindahkan lingkaran
void clearMatrix(Mat &matrix); 
// Fungsi untuk membersihkan matriks
Point currentCenter; 
// Menyimpan bola saat berada di titik pusat
char windowName[] = "Circle Animation"; 
// Nama jendela untuk lingkaran akan menarik
int moveSpeed = 10; 
// Kecepatan gerakan
Mat mat; 
// Matrix untuk menggambar lingkaran
bool moving = false; 
// Pertama, bola tidak bergerak 
int w=500; 
// Menentukan lebar jendela
int radius= w/20; 
// Radius bola

    IplImage* GetThresholdedImage(IplImage* imgHSV)
        // Fungsi untuk mendapatkan gambar ambang
{				
    IplImage*imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 
    1); // Kode untuk membuat gambar
    cvInRangeS(imgHSV, cvScalar(105,139,54), cvScalar(123,226,256),  
    imgThresh); // Range untuk objek yang akan dilacak , dalam hal ini    
    kita membatasi objek dari warna biru muda ke biru gelap
    return imgThresh;						
}

void trackObject(IplImage* imgThresh)
{ 
     // Fungsi untuk melacak objeck yang 
     CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));  
     // Memori yang dialokasikan untuk membuat momen baru
     cvMoments(imgThresh, moments, 1);					
     double moment10 = cvGetSpatialMoment(moments, 1, 0);  
     double moment01 = cvGetSpatialMoment(moments, 0, 1); 
     double area = cvGetCentralMoment(moments, 0, 0); 
	
// Jika area < 1000, kami menganggap bahwa tidak ada objek dalam gambar  
     if(area > 1000){ // Hitung posisi bola 
     int posX = moment10/area; // Menghitung posisi saat di sumbu x
     int posY = moment01/area; // Menghitung posisi saat di sumbu y

     if(lastX >= 0 && lastY >= 0 && posX >= 0 && posY >= 0) 
{       // Membandingkan lastX , lastY , posX , posY
	moveCircleTo(posX,posY); // Memindahkan posisi lingkaran
}

	lastX = posX;	// Mengatur posX sebagai lastX 
	lastY = posY;	// Mengatur posY sebagai lastY
	}
	free(moments); // Menghapus saat, untuk mempersiapkan momen 
                         berikutnya
}

int main()
{ // Fungsi utama
	currentCenter = Point(lastX,lastY);// Pusat start ( -1 , -1 ) 
	moveCircleTo(w/2,w/2);// Bergerak ke tengah jendela
	cout << "Instruction to Operate The Program :  " << endl;
        // Mencetak instruksi
	cout << "1. Move The Object" << endl; // Mencetak instruksi
	CvCapture* capture =0; capture = cvCaptureFromCAM(0); 
        // Menangkap gambar dari kamera

	if(!capture)
{ // Jika tidak menangkap
	cout << "Capture failure\n" ; // Print komentar
	return -1; // Tidak kembali apa-apa
	}

	IplImage* frame=0; // Mengatur bingkai mulai
	frame = cvQueryFrame(capture); // Mengatur gambar capture  
                                         menjadi bingkai
	
	if(!frame) // Jika tidak bingkai
	return -1; // Tidak kembali apa-apa


	// Membuat gambar kosong yang memiliki ukuran yang sama dari 
          video asli 
	imgTracking=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U, 3); 
       // Membuat gambar
	cvZero(imgTracking); // Track
        cvNamedWindow("Show Video"); // Menampilkan jendela untuk  
        video
	cvNamedWindow("Thresholding Image"); 
       // Menampilkan jendela untuk thresholding citra
	
	
	while(true){ // Sementara benar
	frame = cvQueryFrame(capture); // Bingkai capture 
	if(!frame) // Jika tidak bingkai
	break; // Memecahkan loop

	frame=cvCloneImage(frame); // Membuat file sementara frame
	// Menghaluskan gambar asli menggunakan kernel Gaussian 
	cvSmooth(frame, frame, CV_GAUSSIAN,3,3); 
	IplImage* imgHSV = cvCreateImage(cvGetSize(frame),  
        IPL_DEPTH_8U, 3); // Mengkonversi frame HSV
	cvCvtColor(frame, imgHSV, CV_BGR2HSV); 
        // Mengkonversi dari BGR warna HSV
	// Mengubah format warna dari BGR ke HSV 
	IplImage* imgThresh = GetThresholdedImage(imgHSV);
	// Halus citra biner menggunakan kernel Gaussian 
	cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN,3,3); 
        // Melacak posisi bola 
	trackObject(imgThresh); // track
	 // Menambahkan gambar pelacakan dan frame 
	cvAdd(frame, imgTracking, frame); 
	cvShowImage("Thresholding Image", imgThresh); 
        // Acara imageThres untuk thresholding jendela gambar
	cvShowImage("Show Video", frame); 
        // Menunjukkan bingkai untuk menampilkan video
	// Bersihkan gambar digunakan
	cvReleaseImage(&imgHSV); // Bersih HSV
	cvReleaseImage(&imgThresh); // Bersih thres
	cvReleaseImage(&frame); // Bersih frame
	
	int c = cvWaitKey(10); // Ini adalah milisecond
	
	// Jika ESC ditekan , memberhentikan lingkaran 
	if((char)c==27 ) 
	break; // Istirahat
	} 
	cvDestroyAllWindows() ; // Menghancurkan atau menutup semua 
                                  jendela
	cvReleaseImage(&imgTracking); // ImgTracking bersih
	cvReleaseCapture(&capture); // Capture bersih
	return 0; // Kembali
	}

void MyFilledCircle( Mat img, Point center )
{ // Fungsi menggambar lingkaran
int thickness = -1;	// Ketebalan
int lineType = 8; // Baris
circle( img, // Dimana menggambar
center, // Pusat ( Point)
radius, // Radius
Scalar( 250, 35, 5 ), // Isi warna
thickness, // Tebal
lineType ); // 8 = garis kontinyu
}

void drawImage(char windowNames[], Mat mat)
{ // Fungsi untuk menarik gambar pada jendela
imshow(windowNames,mat); // Menampilkan jendela
}

void moveCircleTo(int x, int y) // Fungsi untuk memindahkan lingkaran
{
	moving = true; 
       // Pertama, kami menetapkan bergerak untuk menjadi benar
       if (x<=radius || x>= w-radius)	
       // Periksa x cuaca itu kurang dari radius atau tidak
       x=radius; // Set benar untuk jari-jari
       if (y<=radius || y>= w-radius)	
       // Memeriksa y wheter kurang dari radius atau tidak
       y=radius; // Set benar untuk jari-jari
       cout << "Moving to: " << x << " " << y <<  endl;	
       // Cetak
       int incrementX = (x > currentCenter.x ? moveSpeed:-moveSpeed);     
       // Memeriksa wheter x > pusat saat ini , jika ya set movespeed 
          ke incrementX .
       int incrementY = (y > currentCenter.y ? moveSpeed:-moveSpeed);      
       // Dan sebaliknya
       int difX = abs(x - currentCenter.x);	
       // Memeriksa berbeda dari X baru dan X lalu
       int difY = abs(y - currentCenter.y);	
       // Memeriksa berbeda dari Y baru dan Y lalu

while(difX > 0 || difY > 0){ // Sementara berbeda > 0
clearMatrix(mat); // Menghapus matriks terakhir
Point newCenter(currentCenter.x += incrementX, currentCenter.y += incrementY); // Set point baru
MyFilledCircle(mat,newCenter); // Menggambar lingkaran
drawImage(windowName,mat); // DShow lingkaran ke jendela
cvWaitKey(10); // Tunggu 10 ms
if(difX > 0) difX -= moveSpeed; // Cek difX positif atau tidak
else incrementX = 0; // Tidak positif ( negatif )
if(difY > 0) difY -= moveSpeed; // Cek difY positif atau tidak
else incrementY = 0; // Tidak positif ( negatif )
}
currentCenter = Point(x,y); // Mengatur pusat saat ini baru
moving = false; // Berhenti bergerak
} 

void clearMatrix(Mat &matrix)
{ // Fungsi matriks yang jelas
matrix = Mat::zeros(w,w,CV_8UC3); 
// Matriks yang jelas , mengatur matriks 0
}

9) Kemudian apabila telah selesai, Tekan F5 untuk menjalankan program tersebut. Hasilnya adalah seperti gambar berikut :

 

 

Like or Share This Article



COMMENTS ( 0 )
 
Keep connected with us, mobile apps available now !!