[java] 자바의 웹캠에서 이미지 캡처?
웹캠에서 이미지를 계속 캡처하려면 어떻게해야합니까?
객체 인식을 실험하고 싶습니다 (아마도 자바 미디어 프레임 워크를 사용하여).
두 개의 스레드를 만들 생각 중이었습니다.
한 스레드 :
- 노드 1 : 라이브 이미지 캡처
- 노드 2 : 이미지를 “1.jpg”로 저장
- 노드 3 : 5 초 대기
- 노드 4 : 반복 …
다른 스레드 :
- 노드 1 : 이미지가 캡처 될 때까지 대기
- 노드 2 : “1.jpg”를 사용하여 모든 픽셀에서 색상 가져 오기
- 노드 3 : 배열에 데이터 저장
- 노드 4 : 반복 …
답변
이 JavaCV 구현은 잘 작동합니다.
암호:
import org.bytedeco.javacv.*;
import org.bytedeco.opencv.opencv_core.IplImage;
import java.io.File;
import static org.bytedeco.opencv.global.opencv_core.cvFlip;
import static org.bytedeco.opencv.helper.opencv_imgcodecs.cvSaveImage;
public class Test implements Runnable {
final int INTERVAL = 100;///you may use interval
CanvasFrame canvas = new CanvasFrame("Web Cam");
public Test() {
canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
}
public void run() {
new File("images").mkdir();
FrameGrabber grabber = new OpenCVFrameGrabber(0); // 1 for next camera
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
IplImage img;
int i = 0;
try {
grabber.start();
while (true) {
Frame frame = grabber.grab();
img = converter.convert(frame);
//the grabbed frame will be flipped, re-flip to make it right
cvFlip(img, img, 1);// l-r = 90_degrees_steps_anti_clockwise
//save
cvSaveImage("images" + File.separator + (i++) + "-aa.jpg", img);
canvas.showImage(converter.convert(img));
Thread.sleep(INTERVAL);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Test gs = new Test();
Thread th = new Thread(gs);
th.start();
}
}
JavaCV에 대한 구성에 대한 게시물 도 있습니다.
코드를 수정하고 정기적으로 이미지를 저장하고 원하는 나머지 처리를 수행 할 수 있습니다.
답변
얼마 전에 PC 웹캠으로 사진을 찍는 데 사용할 수있는 일반 Java 라이브러리를 만들었습니다. API는 매우 간단하고 기능이 과하지 않으며 독립형으로 작동 할 수 있지만 OpenIMAJ, JMF, FMJ, LTI-CIVIL 등과 같은 추가 웹캠 드라이버 및 일부 IP 카메라도 지원합니다.
프로젝트 링크는 https://github.com/sarxos/webcam-capture입니다.
예제 코드 (사진을 찍고 test.jpg에 저장) :
Webcam webcam = Webcam.getDefault();
webcam.open();
BufferedImage image = webcam.getImage();
ImageIO.write(image, "JPG", new File("test.jpg"));
Maven Central Repository 또는 모든 필수 종속성 및 타사 JAR을 포함하는 별도의 ZIP으로도 제공됩니다.
답변
JMyron은 사용이 매우 간단합니다.
http://webcamxtra.sourceforge.net/
myron = new JMyron();
myron.start(imgw, imgh);
myron.update();
int[] img = myron.image();
답변
답변
이런 종류의 JavaCV를 사용하는 gt_ebuddy의 답변에서 벗어나지 만 내 비디오 출력은 그의 답변보다 훨씬 더 높은 품질입니다. 또한 다른 임의의 개선 사항을 추가했습니다 (예 : ESC및 CTRL+C을 누를 때 프로그램 을 종료하고 프로그램이 올바르게 사용하는 리소스를 종료하는지 확인).
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
public class HighRes extends JComponent implements Runnable {
private static final long serialVersionUID = 1L;
private static CanvasFrame frame = new CanvasFrame("Web Cam");
private static boolean running = false;
private static int frameWidth = 800;
private static int frameHeight = 600;
private static OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
private static BufferedImage bufImg;
public HighRes()
{
// setup key bindings
ActionMap actionMap = frame.getRootPane().getActionMap();
InputMap inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
for (Keys direction : Keys.values())
{
actionMap.put(direction.getText(), new KeyBinding(direction.getText()));
inputMap.put(direction.getKeyStroke(), direction.getText());
}
frame.getRootPane().setActionMap(actionMap);
frame.getRootPane().setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap);
// setup window listener for close action
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
stop();
}
});
}
public static void main(String... args)
{
HighRes webcam = new HighRes();
webcam.start();
}
@Override
public void run()
{
try
{
grabber.setImageWidth(frameWidth);
grabber.setImageHeight(frameHeight);
grabber.start();
while (running)
{
final IplImage cvimg = grabber.grab();
if (cvimg != null)
{
// cvFlip(cvimg, cvimg, 1); // mirror
// show image on window
bufImg = cvimg.getBufferedImage();
frame.showImage(bufImg);
}
}
grabber.stop();
grabber.release();
frame.dispose();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void start()
{
new Thread(this).start();
running = true;
}
public void stop()
{
running = false;
}
private class KeyBinding extends AbstractAction {
private static final long serialVersionUID = 1L;
public KeyBinding(String text)
{
super(text);
putValue(ACTION_COMMAND_KEY, text);
}
@Override
public void actionPerformed(ActionEvent e)
{
String action = e.getActionCommand();
if (action.equals(Keys.ESCAPE.toString()) || action.equals(Keys.CTRLC.toString())) stop();
else System.out.println("Key Binding: " + action);
}
}
}
enum Keys
{
ESCAPE("Escape", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)),
CTRLC("Control-C", KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK)),
UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),
DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),
LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)),
RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0));
private String text;
private KeyStroke keyStroke;
Keys(String text, KeyStroke keyStroke)
{
this.text = text;
this.keyStroke = keyStroke;
}
public String getText()
{
return text;
}
public KeyStroke getKeyStroke()
{
return keyStroke;
}
@Override
public String toString()
{
return text;
}
}
답변
Java Webcam SDK 라이브러리도 사용해 볼 수 있습니다. SDK 데모 애플릿은 링크 에서 사용할 수 있습니다 .
답변
저는 화상 회의 응용 프로그램에서 JMF를 사용했으며 두 개의 랩톱에서 잘 작동했습니다. 하나는 통합 웹캠이 있고 다른 하나는 오래된 USB 웹캠이 있습니다. 사전에 JMF를 설치하고 구성해야하지만 일단 완료되면 Java 코드를 통해 하드웨어에 매우 쉽게 액세스 할 수 있습니다.