Herkese merhaba bu yazıda opencv ile renk tespit etmeyi göreceğiz. Temel mantık elde edilen görüntünün ilk önce HSV renk formatına çevirmek ve buradan elde edilen yeni frame değerimizi inrange fonksiyonu ile treshholding işlemine tabi tutuyoruz ve artık milyonlarca olan renk sayısını sadece 2 renge kadar düşürüyoruz siyah ve beyaz. Bu adımdan sonra ise bizim hedef nesnemiz artık sadece beyaz piksellerin olduğu alanlar olacaktır siyah piksel dolu bölgeler bizim hedefimiz dışında olacaktır. Bu olayı gerçekleştirmek için şu işlem adımlarını gerçekleştireceğiz.
- Olarak kameramızdan görüntü alıyoruz.
- Olarak Track Bar’lar oluşturuyoruz ki renk değişimlerini hzılı bir şekilde görebilelim.(bu ayarları değiştirerek tespit edeceğimiz rengi seçeceğiz)
- Sonsuz döngü ile kameradan görüntü almaya başlıyoruz.
- Olarak elde edilen görünütüyü HSV renk formatına çeviriyoruz.
- Olarak inrange fonksiyonu ile artık tespit edeceğimiz rengi seçmeye başlıyoruz.(Treshholding işlemi aslında) Burada scalar fonksiyonu ile renk değişimini sağlıyoruz, fonksiyon 3 parametre alıyor sırası ile mavi yoğunluğu, yeşil yoğunluğu,kırmızı yoğunluğu şeklinde zaten RGB değil de BGR diye geçiyor ama HSV renk formatında çalıştığımız için farklı bir renk uzayındayız misal HSV RGB’den farklı olduğu için burada örneğin kırmızı rengi öne çıkarmak istediğinizde olmayacaktır çünkü format HSV. Ben genelde deneme yanılma yolu ile buluyorum istediğim rengi genelde.
- Son olarak da döngüden çıkış fonksiyonumuzu yazıyoruz.
Şimdi kodları inceleyelim;
#include "stdafx.h" #include <opencv2/opencv.hpp>; using namespace cv; int main() { VideoCapture video(0); Mat okunan,hsv,renkTespit; int minB=0, minG=0, minR=0, maxB=255, maxG=255, maxR=255;//trackbar başlangıç değerleri namedWindow("ayar",CV_WINDOW_AUTOSIZE);//tracbar'ları ekranda göstermek için kullanacağımız pencere createTrackbar("maviMin","ayar",&minB,255);//scalar değerleri için kullanacağımız trackbar'lar createTrackbar("yesilMin","ayar",&minG,255);//ilk parametre gözükecek ismi 2. parametre hangi namedWindow üzerinde görünecek onu belirtir createTrackbar("kirmiziMin", "ayar", &minR, 255);//3. parametre minimum değeri 4. parametre alacağı maksimum değeri gösterir createTrackbar("maivMax", "ayar", &maxB, 255); createTrackbar("yesilMax", "ayar", &maxG, 255); createTrackbar("kirmiziMax", "ayar", &maxR, 255); namedWindow("ayar"); while (true) { video.read(okunan);//kameradan görüntü alıyoruz imshow("orjinal görüntü",okunan);//elde edilen görüntüyü ekranda gösteriyoruz, göstermek zorunda değiliz cvtColor(okunan,hsv,CV_BGR2HSV);//hsv renk formatına çeviriyoruz imshow("hsv", hsv);//elde edilen görüntüyü ekranda gösteriyoruz, göstermek zorunda değiliz inRange(hsv,Scalar(minB,minG,minR),Scalar(maxB,maxG,maxR),renkTespit);//tresholding işlemini yani siyah ve beyaz'a indirgiyoruz imshow("tespit edilen", renkTespit);//elde edilen görüntüyü ekranda gösteriyoruz, göstermek zorunda değiliz if (waitKey(10) == 27)//döngüden çıkış şartı esc tuşuna basılırsa çıksın { break; } } return 0; }
Programı çalıştırdığımızda böyle bir görüntü elde ediyoruz görüldüğü gibi trackbar’ların değerleri değiştirilerek siyah beyaz olan kısımda renk değiştirilebilir ve beyaz olan kısımlar bizim hedef alanımız olmuş olacaktır.
Herkese iyi çalışmalar.