[Java] OpenCV Tutorial

[Java] OpenCV Tutorial

Goal

  • OpenCV 를 통한 비디오 재생 구현


들어가며


Practice

1. OpenCV 라이브러리 생성

  • Ant 설치
    $ brew install ant
      

Ant 설치를 위해서는 /usr/local/bin에 권한이 있어야함

sudo chown -R [USER_NAME] /usr/local/include /usr/local/lib /usr/local/lib/pkgconfig

screenshot001

  • Java OpenCV 설치를 위해서 brew formula 수정
    • -DBUILD_opencv_java=OFF -> -DBUILD_opencv_java=ON
    $ brew edit opencv
    
      [edit]
      

screenshot002

  • OpenCV 빌드

    $ brew install --build-from-source opencv
      

screenshot003

  • 에러 발생
    • brew link 중 디렉터리 권한이 없어 에러 발생
    • 권한 부여 후 제거/재설치

screenshot004

screenshot005

  • 라이브러리 파일 (dll, jar) 생성 확인

screenshot006


2. Java 프로젝트에 라이브러리 적용

  • 라이브러리 프로젝트 내 라이브러리 디렉터리에 복사

screenshot007

  • 프로젝트 우클릭 > Build Path > Configure Build Path…

screenshot008

  • OpenCV jar 추가
    • Add JARs… > opencv jar

screenshot014

screenshot015

  • Native library location > Edit

screenshot016

  • Workspace > [프로젝트명] > lib

screenshot010

screenshot011

  • 동영상 재생 코드 작성
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package io.dorbae.opencv.tutorial;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

/*
 *************************************************
 *
 * VideoPlayer.java
 *
 *************************************************
 * 
 * @version 1.0.0	2019-01-23 17:37	Initialize
 * @author dorbae
 * @since 1.0.0
 *
 */
public class VideoPlayer {

	public VideoPlayer() {}
	
	/*
	 * 
	 *
	 * @param args
	 * 
	 * @version 1.0.0	2019-01-23 17:38	Initialize
	 * @author dorbae
	 * @since 1.0.0
	 *
	 */
	public static void main( String[] args) {
		// Native 라이브러리 로드
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		
		// 로드할 영상
	    VideoCapture camera = new VideoCapture("/Users/dorbae/Downloads/wedding.avi");
	    
	    // Video 출력 화면 프레임
	    JFrame jframe = new JFrame("OpenCV Tutorial by dorbae");
	    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    JLabel vidpanel = new JLabel();
	    jframe.setContentPane(vidpanel);
	    jframe.setVisible(true);
	    jframe.doLayout();
	    jframe.setBounds(0, 0, 640, 480);
	    
	    Mat frame = new Mat();	// Frame
	    try {
		    while ( true) {
		        if ( camera.read( frame)) {
		        	// 이미지 로드
		            ImageIcon image = new ImageIcon(Mat2BufferedImage(frame));
		            vidpanel.setIcon(image);
		            vidpanel.repaint();
		        }
		    }
	    } catch( Exception e) {
	    	e.printStackTrace();
	    }
	}
	
	/*
	 * 
	 *
	 * @param matrix
	 * @return
	 * @throws Exception
	 * 
	 * @version 1.0.0	2019-01-25 11:33	Initialize
	 * @autho dorbae
	 * @since 1.0.0
	 *
	 */
	private static BufferedImage Mat2BufferedImage(Mat matrix)throws Exception {        
	    MatOfByte mob=new MatOfByte();
	    Imgcodecs.imencode(".jpg", matrix, mob);
	    byte ba[]=mob.toArray();

	    BufferedImage bi=ImageIO.read(new ByteArrayInputStream(ba));
	    return bi;
	}
}

screenshot012

에러 (opencv 4.0.1 jar는 java 11 버전에서 빌드)) -> runtime java 버전 변경

screenshot013

  • 실행결과

screenshot017



References

댓글남기기

-->