OpenCV içerisinde yer alan imshow() metodu parametre olarak verdiğiniz bir mat nesnesini resim tipine dönüştürerek bir pencere içerisinde ekranda gösterir. Bu metot, C++ ve Python dilleri tarafından desteklenmektedir. Yeni başlayanlar örneklerde sıklıkla gördüğü bu metodu Java da denediğinde metodun olmadığını görmüştür. Sıklıkla bu imshow() yerine hangi metot var sorusu gelmektedir, bu yüzden mat tipinin nasıl image tipine dönüştürüleceğini ve frame içerisinde gösterilebileceğini anlatacağım. Tabi bunları swing kütüphanesi yardımıyla gerçekleştiriyor olacağız.
Mat tipi bildiğiniz üzere görüntünün renk değerlerinin, renk uzayı ile birlikte sayısal olarak ifade edilip matris olarak tutulduğu nesnelerdir. Öncelikli olarak bu değerleri okuyup image nesnesine daha sonrada bu image nesnesini frame nesnesi içerisinde görüntüleyeceğiz.
Öncelikle mat nesnesini buffered image nesnesine çevirelim.
private static BufferedImage ConvertMat2Image(Mat kameraVerisi) { MatOfByte byteMatVerisi = new MatOfByte(); // Ara belleðe verilen formatta görüntü kodlar Imgcodecs.imencode(".jpg", kameraVerisi, byteMatVerisi); // Mat nesnesinin toArray() metodu elemanlarý byte dizisine çevirir byte[] byteArray = byteMatVerisi.toArray(); BufferedImage goruntu = null; try { InputStream in = new ByteArrayInputStream(byteArray); goruntu = ImageIO.read(in); } catch (Exception e) { e.printStackTrace(); return null; } return goruntu; }
Daha sonra frame içerisinde görüntüleyelim. Eğer gerçek zamanlı bir iş yapacaksanız ve sürekli olarak ekrana yakalanan görüntüyü basacaksanız bu metodu her çağırdığınızda yeni bir frame içerisinde açacaktır bu durumda uygulamanın kilitlenmesi ile sonuçlanacaktır. Bu sorunu aşmak için aşağıdaki yöntemi uygulayacağız ve bir kurucu metot yazarak gerekli nesnelerin tek bir defa oluşturulmasını sağlayacağız.
// Bir frame (çerçeve) oluşturur public static void PencereHazirla() { frame = new JFrame(); frame.setLayout(new FlowLayout()); frame.setSize(700, 600); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } // Resmi gösterecek label oluşturur public static void PushImage(Image img2) { // Pencere oluşturulmamış ise hazırlanır if (frame == null) PencereHazirla(); // Daha önceden bir görüntü yüklenmiş ise yenisi için kaldırır if (lbl != null) frame.remove(lbl); icon = new ImageIcon(img2); lbl = new JLabel(); lbl.setIcon(icon); frame.add(lbl); // Frame nesnesini yeniler frame.revalidate(); }
Örnek kullanım;
public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); VideoCapture capture = new VideoCapture(0); Mat camImage = new Mat(); if (capture.isOpened()) { while (true) { capture.read(camImage); PushImage(ConvertMat2Image(camImage)); } } }