Setelah berhasil mengakses webcam dan menampilkan gambar di layar, kini saatnya kita memanipulasi gambar. Seperti kita ketahui bahwa OpenCV sering kali digunakan untuk memanipulasi gambar secara realtime. Jadi, kita tidak perlu mengambil gambar terlebih dahulu lalu mengolah di photoshop atau corel. Nah, untuk kali ini kita akan belajar cara mendeteksi objek berdasarkan warna.
Umumnya, warna yang digunakan dalam webcam adalah warna RGB (Red, Green, Blue). Nah, dalam OpenCV ketiga warna ini dibalik urutannya, yaitu BGR. Dengan mengetahui nilai BGR suatu objek, maka kita dapat menentukan jenis objek tersebut (jika objek-objek yang kita miliki memiliki warna yang berbeda-beda).
Pertama, buat project baru dari template OpenCV, beri nama filenya “deteksiwarna”. Lalu, buat 2 Button, 4 Label, 4 Trackbar dan 1 PictureBox seperti gambar di bawah. Ganti Properties “Maximum” pada ketiga Trackbar R, G, B menjadi 255 sedangkan pada Toleransi menjadi 10. Lalu pada PictureBox1 ganti properties “SizeMode” menjadi StrecthImage.
Selanjutnya klik 2 kali pada setiap Trackbar dan masukkan kode berwarna merah berikut:
int red,green,blue,tol;
private: System::Void trackBar1_Scroll(System::Object^ sender, System::EventArgs^ e) {
label1->Text="R : "+trackBar1->Value;
red=trackBar1->Value;
}
private: System::Void trackBar2_Scroll(System::Object^ sender, System::EventArgs^ e) {
label2->Text="G : "+trackBar2->Value;
green=trackBar2->Value;
}
private: System::Void trackBar3_Scroll(System::Object^ sender, System::EventArgs^ e) {
label3->Text="B : "+trackBar3->Value;
blue=trackBar3->Value;
}
private: System::Void trackBar4_Scroll(System::Object^ sender, System::EventArgs^ e) {
label4->Text="Toleransi : "+trackBar4->Value;
tol=trackBar4->Value;
}
Kemudian klik 2 kali pada tombol “Mulai” dan “Berhenti” lalu masukkan kode berwarna merah berikut:
int tutup;
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
VideoCapture kamera;
kamera.open(0);
Mat gambar,asli;
vector<vector<cv::Point>> kontur;
vector<vector<cv::Point>> bigkontur;
vector<Vec4i> hierarchy;
cv::Point2f center;
float radius;
tutup=0;
namedWindow("tes",0);
namedWindow("asli",0);
while(tutup==0){
kamera>>gambar;
asli=gambar;
GaussianBlur(gambar,gambar,cv::Size(9,9),9,9,4);
inRange(gambar,Scalar(blue-tol,green-tol,red-tol),Scalar(blue+tol,green+tol,red+tol),gambar);
Mat elem=getStructuringElement(2,cv::Size(5,5),cv::Point(-1,-1));
dilate(gambar,gambar,elem);
erode(gambar,gambar,elem);
dilate(gambar,gambar,elem);
imshow("asli",asli);
imshow("tes",gambar);
resizeWindow("asli",320,240);
resizeWindow("tes",320,240);
Canny(gambar,gambar,100,400);
findContours(gambar,kontur,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cv::Point(0,0));
for (vector<vector<cv::Point> >::iterator it = kontur.begin(); it != kontur.end();)
{
if (it->size() < 50)
{
it = kontur.erase(it);
}//endif
else
++it;
}//endfor
if(kontur.size()!=0)
{
int k=kontur.size()-1;
double skontur=0;
double bkontur=contourArea(kontur[k]);
for(int i=k;i>0;i--)
{
skontur=contourArea(kontur[i-1]);
if (abs(skontur)>abs(bkontur))
{
bkontur=skontur;
kontur[k].swap(kontur[i-1]);
}//endif
}//endfor
bigkontur.push_back(kontur[k]);
drawContours(asli,bigkontur,0,cv::Scalar(55,0,255),2,8,hierarchy,0,cv::Point());
minEnclosingCircle((Mat)bigkontur[0],center,radius);
circle(asli,center,3,Scalar(0,0,255),-1);
bigkontur.clear();
}//endif
Mat img1 = asli;
System::Drawing::Graphics^ graphics1 = pictureBox1->CreateGraphics();
System::IntPtr ptr1(img1.ptr());
System::Drawing::Bitmap^ b1 = gcnew System::Drawing::Bitmap(img1.cols,
img1.rows, img1.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ptr1);
System::Drawing::RectangleF rect1(0, 0, pictureBox1->Width, pictureBox1->Height);
graphics1->DrawImage(b1, rect1);
waitKey(100);
}//endwhile
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
tutup=1;
destroyAllWindows();
}
Jangan lupa pula menambahkan event FormClosing pada MyForm. Klik MyForm, pada Tab Properties klik “Events” (ikon petir) – FormClosing – lalu tekan Enter dan masukkan kode berwarna merah berikut:
private: System::Void MyForm_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e){
tutup=1;
}
Prinsip kerja program ini dapat dijelaskan sebagai berikut. Pertama, gambar dihaluskan dengan fungsi GaussianBlur(). Selanjutnya gambar difilter sesuai warna yang ditentukan dari trackbar dengan fungsi inRange(). Selanjutnya untuk mengurangi noise digunakan fungsi dilate() dan erode(). Selanjutnya dilakukan deteksi tepi dengan fungsi Canny() dan fungsi findContours(). Bedanya deteksi tepi dengan kontur adalah bahwa kontur hanya memuat koordinat titik-titik yang saling berhubungan membentuk sebuah bidang dari gambar hasil deteksi tepi. Kontur yang didapatkan jumlahnya sangat banyak, oleh karena itu perlu difilter dengan cara membandingkan luas setiap kontur yang diperoleh dari fungsi contourArea(). Selanjutnya kontur dengan luas terbesar akan ditampilkan dengan fungsi drawContours(). Kontur terbesar ini juga bisa dicari titik tengahnya dengan fungsi minEnclosingCircle() dan untuk menampilkan titik tengah ini bisa digunakan fungsi circle().
Nah, dengan mengubah-ubah trackbar, kita bisa mendapatkan warna apa yang ingin kita deteksi. Supaya lebih mudah, gunakan tombol printscreen di keyboard lalu simpan dan cari tahu RGB dari objek yang ingin kita deteksi. Kalau saya biasanya menggunakan CorelDRAW. Oh iya, jangan lupa tempat pengambilan gambar kalau bisa di tempat yang terang dan memiliki background putih bersih biar nggak banyak noise. OK, selamat ngoding...
admin ini pke opencv versi brp min,,, kok librarynya beda ya?? programnya gk jalan min
ReplyDeleteWindows has triggered a breakpoint in deteksiwarna.exe.
ReplyDeleteThis may be due to a corruption of the heap, which indicates a bug in deteksiwarna.exe or any of the DLLs it has loaded.
Mohon pencerahan kalau pesan errornya seperti ini apa yang kurang, sy coba sampel program deteksiwarna, terimakasih.
Assalamualaikum, gan. Mohon izin bertanya, ini GUI nya pake C#? Jika iya cara atur opencv nya gmna yaa kalo boleh tau. Terimakasih.
ReplyDeleteAssalamualaikum, gan. Mohon izin bertanya, ini GUI nya pake C#? Jika iya cara atur opencv nya gmna yaa kalo boleh tau. Terimakasih.
ReplyDeleteAssalamualaikum, gan. Mohon izin bertanya, ini GUI nya pake C#? Jika iya cara atur opencv nya gmna yaa kalo boleh tau. Terimakasih.
ReplyDeletedeteksi dan kunnci 2 warna dalam satu kamera
ReplyDelete