Hasilnya kurang lebih seperti ini:
Codingan dari gambar diatas seperti ini:
#include "opencv2/highgui/highgui.hpp"Panjang ya? Emang! hehehe
#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;
}
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 :)
0 Response to "Tracking warna berdasarkan besarnya contours dan pengaplikasian moments - OpenCV"
Post a Comment