Daha önce opencv kurulumunu ele almıştık aynı kategorideki yazılardan faydalanabilirsiniz.
Opencv ile kamerada yakalanan objelerin tespit edilmesinin farklı yolları vardır,bu yazıda nesnelerin renklerine göre nasıl yakalanabileceğine bakacağız.Tek bir sınıfımız olacak bu sınıf ile ilk olarak sistemdeki kameraya bağlanıp ardından yakalanan görüntüde istediğimiz renge sahip nesneyi yakalayarak bu nesnenin etrafını çizeceğiz.Bu işlemlerin hepsi için pratik opencv sınıf ve metotları mevcuttur.Renkleri karşılaştırırken R G B kodlarına göre karşılaştırma yapabilirsiniz.Projede renklerin kameradaki farklı parametrelere göre farklı görünebileceğini düşünerek minumum ve maksimum diye nitelendirdiğimiz o rengin açığı ve koyusunu belirterek istediğimiz rengi yakalayacağız yakalanan fotoğrafa thresholding uygulayarak gereksiz yerleride atacağız .Thresholding ile ilgili bilgilere buradan ulaşabilirsiniz. .Proje örnek olarak kullanacağım renk sarı olacak.Aynı anda bir den fazla objeyi yakalamakta mümkün bunun için gerekli açıklamaları proje kodları içerisinde bulabilirsiniz.
Kullandığım opencv versiyonu 2.4.11 şu anda 3 sürümü mevcut fakat bir çok sınıf ve metot değiştiği için 3x sürümlerinde sıkıntı çıkabileceğini unutmayın.Kullanmak istiyorsanız da opencv.org üzerindeki 3 dokümanına göz atabilirsiniz,uyarlamanız için size yardımcı bilgiler içermektedir.
import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; //OPENCV 2.4.11 import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.highgui.*; import org.opencv.imgproc.*; import org.opencv.core.CvType; class Panel extends JPanel { private static final long serialVersionUID = 1L; private BufferedImage image; public Panel() { super(); } private BufferedImage getimage() { return image; } public void setimage(BufferedImage newimage) { image = newimage; return; } public void setimagewithMat(Mat newimage) { image = this.matToBufferedImage(newimage); return; } public BufferedImage matToBufferedImage(Mat matrix) { int cols = matrix.cols(); int rows = matrix.rows(); int elemSize = (int) matrix.elemSize(); byte[] data = new byte[cols * rows * elemSize]; int type; matrix.get(0, 0, data); switch (matrix.channels()) { case 1: type = BufferedImage.TYPE_BYTE_GRAY; break; case 3: type = BufferedImage.TYPE_3BYTE_BGR; //renk dönüşümü byte b; for (int i = 0; i < data.length; i = i + 3) { b = data[i]; data[i] = data[i + 2]; data[i + 2] = b; } break; default: return null; } BufferedImage image2 = new BufferedImage(cols, rows, type); image2.getRaster().setDataElements(0, 0, cols, rows, data); return image2; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); BufferedImage temp = getimage(); if (temp != null) g.drawImage(temp, 10, 10, temp.getWidth(), temp.getHeight(), this); } } public class ColorTracking { public static void main(String arg[]) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); try { //Yakalamak istediğim renklerin kodları min ve max olarak verilmiştir Scalar hsv_min = new Scalar(21, 100, 100); Scalar hsv_max = new Scalar(31, 255, 255); //Varsayılan webcam 0 dır sistemdeki diğer kameralar 1,2,3,4 şeklinde indexlenmektedirler trackColor(1, hsv_min, hsv_max); } catch (AWTException e) { e.printStackTrace(); } return; } //Renge göre objeyi takip eder private static void trackColor(int webcam, Scalar colorMin, Scalar colorMax) throws AWTException { //Kamera frame orjinal görüntüye sahiptir JFrame frmeaCamera = new JFrame("Kamera"); frmeaCamera.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmeaCamera.setSize(640, 480); frmeaCamera.setBounds(0, 0, frmeaCamera.getWidth(), frmeaCamera.getHeight()); Panel panel1 = new Panel(); frmeaCamera.setContentPane(panel1); frmeaCamera.setVisible(true); //HSV görüntüye sahiptir JFrame frameHsv = new JFrame("HSV"); frameHsv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frameHsv.setSize(640, 480); frameHsv.setBounds(300, 100, frameHsv.getWidth() + 300, 100 + frameHsv.getHeight()); Panel panel2 = new Panel(); frameHsv.setContentPane(panel2); frameHsv.setVisible(true); //Yakalanan objelerin görüntüsüne sahiptir JFrame frameThreshold = new JFrame("Threshold"); frameThreshold.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frameThreshold.setSize(640, 480); frameThreshold.setBounds(900, 300, frameHsv.getWidth() + 900, 300 + frameHsv.getHeight()); Panel panel4 = new Panel(); frameThreshold.setContentPane(panel4); frameThreshold.setVisible(true); // Vivdeo akışı VideoCapture capture = new VideoCapture(webcam); //Video çözünürlülükleri capture.set(3, 1024); capture.set(4, 768); Mat webcam_image = new Mat(); Mat hsv_image = new Mat(); Mat thresholded = new Mat(); Mat thresholded2 = new Mat(); capture.read(webcam_image); frmeaCamera.setSize(webcam_image.width() + 40, webcam_image.height() + 60); frameHsv.setSize(webcam_image.width() + 40, webcam_image.height() + 60); frameThreshold.setSize(webcam_image.width() + 40, webcam_image.height() + 60); Mat array255 = new Mat(webcam_image.height(), webcam_image.width(), CvType.CV_8UC1); array255.setTo(new Scalar(255)); Mat distance = new Mat(webcam_image.height(), webcam_image.width(), CvType.CV_8UC1); List<Mat> lhsv = new ArrayList<Mat>(3); Mat circles = new Mat(); double[] data = new double[3]; //Webcam açılmış ,çalışıyor ise if (capture.isOpened()) { while (true) { capture.read(webcam_image); if (!webcam_image.empty()) { Imgproc.cvtColor(webcam_image, hsv_image, Imgproc.COLOR_BGR2HSV/* COLOR_BGR2RGB */); //Min ve max renk uzaylarına göre karşılaştırma Core.inRange(hsv_image, colorMin, colorMax,thresholded); //birden fazla renk yakalamak için //Core.inRange(hsv_image, colorMin2, colorMax2,thresholded2); Imgproc.erode(thresholded, thresholded, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(8, 8))); Imgproc.dilate(thresholded, thresholded, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(8, 8))); Core.split(hsv_image, lhsv); Mat S = lhsv.get(1); Mat V = lhsv.get(2); Core.subtract(array255, S, S); Core.subtract(array255, V, V); S.convertTo(S, CvType.CV_32F); V.convertTo(V, CvType.CV_32F); Core.magnitude(S, V, distance); Core.inRange(distance, new Scalar(0.0), new Scalar(200.0), thresholded2); Core.bitwise_and(thresholded, thresholded2, thresholded); Imgproc.GaussianBlur(thresholded, thresholded, new Size(9, 9), 0, 0); List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.HoughCircles(thresholded, circles, Imgproc.CV_HOUGH_GRADIENT, 2, thresholded.height() / 8, 200, 100, 0, 0); Imgproc.findContours(thresholded, contours, thresholded2, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); //Yakalanan nesneyi nokta çizerek belirtir,scalar çizim rengi, 2 ise kalınlıktır Imgproc.drawContours(webcam_image, contours, -1, new Scalar(255, 0, 0), 5); System.out.println(contours.size()); // -- Resimi panellere ekler //Data dizisi renk kodlarını tutmaktadır panel1.setimagewithMat(webcam_image); panel2.setimagewithMat(hsv_image); panel4.setimagewithMat(thresholded); frmeaCamera.repaint(); frameHsv.repaint(); // frame3.repaint(); frameThreshold.repaint(); } else { System.out.println("GÖRÜNTÜ ALINAMADI"); break; } } } } }