захват изображения с веб-камеры в java?

<p>как я могу непрерывно захватывать изображения с веб-камеры?</p><p>я хочу поэкспериментировать с распознаванием объектов (возможно, с помощью java media framework). </p><p>я думал о создании двух потоков</p><p>одна нить:</p><ul> <li>узел 1: захват живого изображения</li> <li>узел 2: сохранить изображение как «1.jpg»</li> <li>узел 3: подождите 5 секунд</li> <li>узел 4: повторить ...</li> </ul><p>другая тема:</p><ul> <li>узел 1: дождитесь захвата изображения</li> <li>узел 2: с помощью «1.jpg» получаем цвета от каждого пикселя</li> <li>узел 3: сохранить данные в массивах</li> <li>узел 4: повторить ...</li> </ul>

<p>эта реализация javacv работает отлично.</p><p>код:</p><pre><code>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(); } } </code></pre><p>также есть <a href="http://ganeshtiwaridotcomdotnp.blogspot.com/2017/01/javacv-configuration-in-windows.html">пост по настройке для javacv</a> </p><p>вы можете изменить коды и иметь возможность сохранять изображения через регулярные промежутки времени и делать оставшуюся обработку, которую вы хотите.</p>

<p>некоторое время назад я создал универсальную библиотеку java, которую можно использовать для фотосъемки с веб-камеры пк. api очень прост, не перегружен, может работать автономно, но также поддерживает дополнительные драйверы веб-камер, такие как openimaj, jmf, fmj, lti-civil и т.д., и некоторые ip-камеры.</p><p>ссылка на проект есть <a href="https://github.com/sarxos/webcam-capture">https://github.com/sarxos/webcam-capture</a> </p><p>пример кода (сделайте снимок и сохраните в test.jpg):</p><pre><code>webcam webcam = webcam.getdefault(); webcam.open(); bufferedimage image = webcam.getimage(); imageio.write(image, "jpg", new file("test.jpg")); </code></pre><p>он также доступен в центральном репозитории maven или в виде отдельного zip-файла, который включает все необходимые зависимости и сторонние jar-файлы.</p>

<p>jmyron очень прост в использовании . <a href="http://webcamxtra.sourceforge.net/">http://webcamxtra.sourceforge.net/</a> </p><pre><code>myron = new jmyron(); myron.start(imgw, imgh); myron.update(); int[] img = myron.image(); </code></pre>

<p> <a href="https://stackoverflow.com/questions/115835/what-is-the-best-method-to-capture-images-from-a-live-video-device-for-use-by-a">здесь</a> аналогичный вопрос с некоторыми - но пока не принятыми - ответами. один из них упоминает <a href="http://fmj-sf.net/">fmj</a> как альтернативу java jmf.</p>

<p>этот вид отклоняется от ответа gt\_ebuddy с использованием javacv, но мой вывод видео гораздо более высокого качества, чем его ответ. я также добавил некоторые другие случайные улучшения (например, закрытие программы, когда <kbd>esc</kbd> а также <kbd>ctrl+c</kbd> и убедитесь, что ресурсы, используемые программой, закрыты).</p><pre><code>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; } } </code></pre>

<p>вы можете попробовать <a href="http://www.smaxe.com/product.jsf?id=juv-webcam-sdk">java webcam sdk</a> library также . демонстрационный апплет sdk доступен по адресу <a href="http://demo.smaxe.com/juv-na-demo-webcam.html">link</a> .</p>

<p>я использовал jmf в приложении для видеоконференций, и он хорошо работал на двух ноутбуках: один со встроенной веб-камерой, а другой со старой веб-камерой usb. это требует, чтобы jmf был установлен и настроен заранее, но как только вы закончите, вы можете получить доступ к оборудованию через код java довольно легко.</p>

<p>вы можете попробовать <a href="http://marvinproject.sourceforge.net">marvin framework</a> . предоставляет интерфейс для работы с камерами. кроме того, он также предоставляет набор функций обработки видео в реальном времени, таких как отслеживание и фильтрация объектов.</p><p>взглянуть!</p><p>демо обработка видео в реальном времени:<br/> <a href="http://www.youtube.com/watch?v=d5mbt0kryvk">http://www.youtube.com/watch?v=d5mbt0kryvk</a> </p><p>вы можете использовать источник ниже. просто сохраняйте кадр с помощью <strong>marvinimageio.saveimage ()</strong> каждые 5 секунд.</p><p><strong>демонстрация видео с веб-камеры:</strong></p><pre><code>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); } } </code></pre><p>для тех, кто просто хочет сделать одну фотографию:</p><p><strong>webcampicture.java</strong></p><pre><code>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(); } } } </code></pre>

<h1>я использовал api веб-камеры capture ... вы можете скачать с этого <a href="http://webcam-capture.sarxos.pl/">http://webcam-capture.sarxos.pl/</a> </h1><pre><code> 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")); } } } </code></pre>

<p> <a href="http://grack.com/downloads/school/enel619.10/report/java\_media\_framework.html">http://grack.com/downloads/school/enel619.10/report/java\_media\_framework.html</a> </p><p>использование проигрывателя с swing</p><p>player может быть легко использован в приложении swing. следующий код создает программу захвата тв на основе swing с выводом видео во всем окне:</p><pre><code>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(); } } </code></pre>

<p>java обычно не любит доступ к аппаратному обеспечению, поэтому вам понадобится какая-то программа-драйвер, как сказал goldenmean. я сделал это на своем ноутбуке, найдя программу командной строки, которая делает снимок. тогда это то же самое, что объяснил goldenmean; вы запускаете программу командной строки из вашей java-программы в подпрограмме takepicture (), а остальная часть вашего кода выполняется так же.</p><p>за исключением части о считывании значений пикселей в массив, вам может быть лучше сохранить файл в bmp, который уже почти соответствует этому формату, а затем использовать стандартные библиотеки изображений java на нем. </p><p>использование программы командной строки добавляет зависимость к вашей программе и делает ее менее переносимой, но так ли была веб-камера, верно?</p>

<p>я полагаю, что прикладное программное обеспечение веб-камеры, которое поставляется вместе с веб-камерой, или ваше собственное программное обеспечение веб-камеры windows можно запустить в пакетном сценарии (сценарий windows/dos) после включения веб-камеры (т. е. если требуется внешнее питание). поставка). в сценарии bacth вы можете добавить соответствующую задержку для захвата после определенного периода времени. и продолжайте выполнять команду захвата в цикле.</p><p>я думаю, это должно быть возможно</p><p>-объявление</p>

<p>это может сделать fmj, а также вспомогательная библиотека, которую он использует, lti-civil. оба находятся на sourceforge.</p>

<p>рекомендую использовать fmj для мультимедийного родственника java-приложения.</p>

<p>попробуйте использовать jmyron <a href="http://howto-java.blogspot.com/2012/05/how-to-use-webcam-using-java.html">как использовать веб-камеру с помощью java</a> . я думаю, что использование jmyron - это самый простой способ получить доступ к веб-камере с помощью java. я пытался использовать его с 64-разрядным процессором, но он выдал ошибку. впрочем, на 32-битном процессоре он работал нормально.</p>

<p>для этого в <a href="http://processing.org">processing</a> есть довольно приятный интерфейс, который является своего рода <a href="http://www.flight404.com/\_videos/pigeoncam.mov">pidgin</a> java, разработанным для графики. он используется в некоторых работах по распознаванию изображений, таких как эта ссылка.</p><p>в зависимости от того, что вам нужно из этого, вы можете загрузить библиотеку видео, которая используется там в java, или если вы просто играете с ней, вы можете получить, используя саму обработку.</p>