Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > От CanvasFrame к JPanel. BufferedImage, RTSP поток


Автор: trump42 30.7.2012, 09:53
Здравствуйте. 
Вообщем идейка такая: могу получать rtsp поток (телевизор) и выводить его на экран в виде CanvasFrame, но не имею возможности от руки рисовать интерфейс. Было бы круто сделать JPanel вместо CanvasFrame и выводить сразу 4 телека на экран. Конечно предполагается, что за каждый телек будет отвечать свой поток. Планирую в дальнейшем научиться записывать видео и может чего распознавать, поэтому пользуюсь библиотекой JavaCV. 

Добрые люди советовали использовать: jLabel1.setIcon(new ImageIcon( originalImage.getBufferedImage() )); да что-то как-то не вяжется. Сам новичок в Java поэтому есть некоторые казусы с которыми я проваливаюсь в Ступр. Помогите!

Код работающего вывода окна:
Код

package javacvproject;

import static com.googlecode.javacv.cpp.opencv_core.CV_AA;  
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;  
import static com.googlecode.javacv.cpp.opencv_core.cvGetSeqElem;  
import static com.googlecode.javacv.cpp.opencv_core.cvLoad;  
import static com.googlecode.javacv.cpp.opencv_core.cvPoint;  
import static com.googlecode.javacv.cpp.opencv_core.cvRectangle;  
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;  
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;  
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2GRAY;  
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor;  
import static com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects;  
  
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage;  
import com.googlecode.javacv.cpp.opencv_core.CvRect;  
import com.googlecode.javacv.cpp.opencv_core.CvScalar;  
import com.googlecode.javacv.cpp.opencv_core.CvSeq;  
import com.googlecode.javacv.cpp.opencv_core.IplImage;  
import com.googlecode.javacv.cpp.opencv_objdetect.CvHaarClassifierCascade;

import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.*;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_calib3d.*;
import com.googlecode.javacv.cpp.opencv_highgui;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;

public class FaceRTSP {

    public static void main(String[] args) throws Exception {
        /*
         * rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_4.sdp –aajtak 
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_2.sdp - times now
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_7.sdp -headlines today
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_29.sdp -ndtv 24*7
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_31.sdp - ndtv profit
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_32.sdp - ndtv goodtimes
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_33.sdp - ndtv india
            rtsp://ss1c6.idc.mundu.tv:554/prf1/cid_34.sdp -cnbc awaaz
            rtsp://ss1c6.idc.mundu.tv:554/prf0/cid_35.sdp - cnbc Tv18
            rtsp://121.244.145.226:554/prf0/cid_45.sdp - zee business
            rtsp://121.244.145.226:554/prf0/cid_38.sdp - zee marathi
            rtsp://121.244.145.226:554/prf0/cid_41.sdp -zee tv
            rtsp://121.244.145.226:554/prf0/cid_50.sdp - zee regional
            rtsp://121.244.145.226:554/prf0/cid_52.sdp - zee regional
            rtsp://121.244.145.226:554/prf0/cid_54.sdp - zee regional
            rtsp://121.244.145.226:554/prf0/cid_55.sdp - zee regional
            rtsp://121.244.145.226:554/prf0/cid_61.sdp - ten action
            rtsp://121.244.145.226:554/prf0/cid_62.sdp - etc
            rtsp://121.244.145.226:554/prf0/cid_56.sdp - zing
            rtsp://121.244.145.226:554/prf0/cid_57.sdp -zee classic
            rtsp://121.244.145.226:554/prf0/cid_58.sdp zee smile
         */
        //rtsp://62.149.26.237:1935/tv/_definst_/ntn
        //rtsp://62.149.26.237:1935/tv/_definst_/k1
        //rtsp://iptv.karelia.ru/ort.sdp
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber("rtsp://62.149.26.237:1935/tv/_definst_/inter");
        grabber.start();

        IplImage image = grabber.grab();


        CanvasFrame canvasFrame = new CanvasFrame("Web Cam Detection Going on");
        canvasFrame.setCanvasSize(image.width(), image.height());
        canvasFrame.setDefaultCloseOperation(CanvasFrame.EXIT_ON_CLOSE);
        
        while (true) {
            IplImage originalImage = grabber.grab();
            canvasFrame.showImage(originalImage);
        }

    }

}


Мои эксперименты:
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import static com.googlecode.javacv.cpp.opencv_core.CV_AA;  
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;  
import static com.googlecode.javacv.cpp.opencv_core.cvGetSeqElem;  
import static com.googlecode.javacv.cpp.opencv_core.cvLoad;  
import static com.googlecode.javacv.cpp.opencv_core.cvPoint;  
import static com.googlecode.javacv.cpp.opencv_core.cvRectangle;  
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;  
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;  
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2GRAY;  
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor;  
import static com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects;  
  
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage;  
import com.googlecode.javacv.cpp.opencv_core.CvRect;  
import com.googlecode.javacv.cpp.opencv_core.CvScalar;  
import com.googlecode.javacv.cpp.opencv_core.CvSeq;  
import com.googlecode.javacv.cpp.opencv_core.IplImage;  
import com.googlecode.javacv.cpp.opencv_objdetect.CvHaarClassifierCascade;

import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.*;
import com.googlecode.javacv.FrameGrabber.Exception;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_calib3d.*;
import com.googlecode.javacv.cpp.opencv_highgui;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
/**
 *
 * @author 7я
 */
public class ChPanel extends javax.swing.JPanel {

    /**
     * Creates new form ChPanel
     */
    public ChPanel() {
        initComponents();
    }

    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        jLabel1.setText("jLabel1");

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 182, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton1)
                .addGap(131, 131, 131))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jButton1))
                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE))
                .addContainerGap())
        );
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            OpenCVFrameGrabber grabber = new OpenCVFrameGrabber("rtsp://62.149.26.237:1935/tv/_definst_/inter");
            grabber.start();
            IplImage image = grabber.grab();
            while (true) {
                IplImage originalImage = grabber.grab();
                jLabel1.setIcon(new ImageIcon( originalImage.getBufferedImage() ));
            }
        } catch (Exception ex) {
            Logger.getLogger(ChPanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration
}


Автор: dorogoyIV 30.7.2012, 11:35
Цитата(trump42 @  30.7.2012,  09:53 Найти цитируемый пост)
Добрые люди советовали использовать

это кто ж такой добрый то?
ну раз у тебя есть BufferedImage, зачем лезть в ImageIcon?
наверняка должны быть другие способы показа изображений в этой библиотеке...
я с ней не работал, и не знаю, поэтому утверждать не буду...

Автор: trump42 30.7.2012, 12:09
Я не сильно разбираюсь, но вот реально рабочий пример и подсказали, что через буферимаг можно мутануть, Так вот интересует как развести 4 буферимага на одном JPanel

Автор: aleksandy 10.9.2012, 05:38
Панели ставишь GridLayout(2, 2), добавляешь на эту панель 4 других, на которых и будет выполняться отрисовка

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)