如何從攝像頭連續捕捉圖像?從java攝像頭捕獲圖像?
我想實驗對象識別(也許使用Java媒體框架)。
我想創建兩個線程
的一個線程:
- 節點1:捕獲實時圖像
- 節點2:保存圖像爲 「1.JPG」
- 節點3:等待5秒鐘
- 節點4:重複...
其他線程:
- 節點1:等待,直到圖像被捕獲
- 節點2:從每一個pixle
- 節點3使用 「1.JPG」 得到的顏色 :在陣列保存數據
- 節點4:重複...
如何從攝像頭連續捕捉圖像?從java攝像頭捕獲圖像?
我想實驗對象識別(也許使用Java媒體框架)。
我想創建兩個線程
的一個線程:
其他線程:
我相信與網絡攝像頭一起附帶的網絡攝像頭應用軟件,或您本地的Windows攝像頭軟件可以在批處理腳本(Windows/DOS腳本)後運行打開網絡攝像頭(即如果需要外部電源)。在bacth腳本中,你可以在一段時間後添加適當的延遲來捕獲。並在循環中繼續執行捕獲命令。
我想這應該是可能
〜AD
的Java通常不喜歡訪問硬件,所以你需要某種類型的驅動程序,如goldenmean說。我在我的筆記本電腦上找到了一個可以捕捉圖片的命令行程序。然後就像goldenmean解釋的那樣;您可以在takepicture()例程中從java程序運行命令行程序,其餘代碼運行相同。
除了將像素值讀入數組的部分之外,通過將文件保存爲接近該格式的BMP文件,然後使用其上的標準Java圖像庫,可能會更好。
使用命令行程序會增加對程序的依賴性,使其不易攜帶,但攝像頭也是如此,對不對?
我在視頻會議應用程序中使用了JMF,它在兩臺筆記本電腦上運行良好:一臺配有集成網絡攝像頭,另一臺配有舊USB攝像頭。它需要事先安裝和配置JMF,但一旦完成,您可以非常容易地通過Java代碼訪問硬件。
你能給我你的項目的代碼片段嗎? – 2013-05-04 06:14:11
在processing中有一個相當不錯的界面,這是一種爲圖形設計的java類型pidgin。它被用於某些圖像識別工作中,如該鏈接。
根據你需要什麼,你可能可以加載在java中使用的視頻庫,或者如果你只是在玩它,你可能會通過使用處理本身。
FMJ可以做到這一點,它可以使用LTI-CIVIL。兩者都在sourceforge上。
http://grack.com/downloads/school/enel619.10/report/java_media_framework.html
使用與Swing
的播放器播放器可以在Swing應用程序可以很容易地使用。使用FMJ爲relatived Java應用程序多媒體
import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.event.*;
public class JMFTest extends JFrame {
Player _player;
JMFTest() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
_player.stop();
_player.deallocate();
_player.close();
System.exit(0);
}
});
setExtent(0, 0, 320, 260);
JPanel panel = (JPanel)getContentPane();
panel.setLayout(new BorderLayout());
String mediaFile = "vfw://1";
try {
MediaLocator mlr = new MediaLocator(mediaFile);
_player = Manager.createRealizedPlayer(mlr);
if (_player.getVisualComponent() != null)
panel.add("Center", _player.getVisualComponent());
if (_player.getControlPanelComponent() != null)
panel.add("South", _player.getControlPanelComponent());
}
catch (Exception e) {
System.err.println("Got exception " + e);
}
}
public static void main(String[] args) {
JMFTest jmfTest = new JMFTest();
jmfTest.show();
}
}
支持建議:下面的代碼創建一個基於Swing-TV捕獲程序在整個窗口中顯示的視頻輸出。
JMyron使用非常簡單。 http://webcamxtra.sourceforge.net/
myron = new JMyron();
myron.start(imgw, imgh);
myron.update();
int[] img = myron.image();
你可以試試Marvin Framework。它提供了一個與相機配合使用的界面。此外,它還提供了一組實時視頻處理功能,如對象跟蹤和過濾。
看一看!
實時視頻處理演示:
http://www.youtube.com/watch?v=D5mBt0kRYvk
您可以使用下面的源。每隔5秒只需使用MarvinImageIO.saveImage()保存一幀。
網絡攝像頭視頻演示:
public class SimpleVideoTest extends JFrame implements Runnable{
private MarvinVideoInterface videoAdapter;
private MarvinImage image;
private MarvinImagePanel videoPanel;
public SimpleVideoTest(){
super("Simple Video Test");
videoAdapter = new MarvinJavaCVAdapter();
videoAdapter.connect(0);
videoPanel = new MarvinImagePanel();
add(videoPanel);
new Thread(this).start();
setSize(800,600);
setVisible(true);
}
@Override
public void run() {
while(true){
// Request a video frame and set into the VideoPanel
image = videoAdapter.getFrame();
videoPanel.setImage(image);
}
}
public static void main(String[] args) {
SimpleVideoTest t = new SimpleVideoTest();
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
對於那些誰只想拿一張照片:
WebcamPicture.java
public class WebcamPicture {
public static void main(String[] args) {
try{
MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter();
videoAdapter.connect(0);
MarvinImage image = videoAdapter.getFrame();
MarvinImageIO.saveImage(image, "./res/webcam_picture.jpg");
} catch(MarvinVideoInterfaceException e){
e.printStackTrace();
}
}
}
這JavaCV實現正常工作。
代碼:
import org.bytedeco.javacv.*;
import static org.bytedeco.javacpp.opencv_core.IplImage;
import static org.bytedeco.javacpp.opencv_core.cvFlip;
import static org.bytedeco.javacpp.opencv_imgcodecs.cvSaveImage;
/**
* Created by gtiwari on 1/3/2017.
*/
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() {
FrameGrabber grabber = new VideoInputFrameGrabber(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((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();
}
}
還有post on configuration for JavaCV
您可以修改代碼,並能夠將圖像保存在固定時間間隔,做你想要處理的其餘部分。
+1你搖滾!我一直在尋找一個很好的開源代碼,並支持在Windows和Linux中用於捕獲攝像頭的JMF的替代方案。這就像一個魅力!謝謝:) – 2012-02-21 18:38:11
不適合我,它說異常在線程「main」java.lang.UnsatisfiedLinkError:C:\ Users \ steve \ AppData \ Local \ Temp \ javacpp213892357885346 \ jniopencv_core.dll:無法找到依賴圖書館 – 2012-09-19 20:03:14
這將工作,但視頻質量不如它應該。查看我的答案以獲得更好的視頻輸出質量 – syb0rg 2013-04-12 22:47:48
你也可以試試Java Webcam SDK庫。 SDK演示小程序可在link。
嘗試使用JMyron How To Use Webcam Using Java。我認爲使用JMyron是使用java訪問攝像頭的最簡單方法。我試圖用它與64位處理器,但它給了我一個錯誤。不過,它在32位處理器上工作得很好。
前段時間我創建了一個通用的Java庫,可用於使用PC攝像頭拍照。 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的中央倉庫或作爲單獨的ZIP其中包括所有所需的依賴關係和第三方JAR。
這種類似於使用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;
}
}
webcam = Webcam.getDefault();
webcam.open();
if (webcam.isOpen()) { //if web cam open
BufferedImage image = webcam.getImage();
JLabel imageLbl = new JLabel();
imageLbl.setSize(640, 480); //show captured image
imageLbl.setIcon(new ImageIcon(image));
int showConfirmDialog = JOptionPane.showConfirmDialog(null, imageLbl, "Image Viewer", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon(""));
if (showConfirmDialog == JOptionPane.YES_OPTION) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Save Image");
chooser.setFileFilter(new FileNameExtensionFilter("IMAGES ONLY", "png", "jpeg", "jpg")); //this file extentions are shown
int showSaveDialog = chooser.showSaveDialog(this);
if (showSaveDialog == 0) { //if pressed 'Save' button
String filePath = chooser.getCurrentDirectory().toString().replace("\\", "/");
String fileName = chooser.getSelectedFile().getName(); //get user entered file name to save
ImageIO.write(image, "PNG", new File(filePath + "/" + fileName + ".png"));
}
}
}
下載這裏是你的answer-- [的Java Swing程序來捕獲攝像頭教程圖片](HTTP:// WWW .tricksmode.com/2013/03/How-To-Capture-Webcam-Images-In-Java-Swings.html) 稍微修改它,你就完成了。 – Aman 2013-03-25 19:44:30