我期待到对于某些情况下半实时检测的图像处理问题。 我的目标是让视频直播如约到达Motion JPEG格式在我的Java代码框架弄好了 。
我熟悉Java媒体框架和可悲的是,我认为我们可以认为一个有效死API。 我也熟悉轴盒和,虽然我很喜欢他们的解决方案,我将不胜感激对我感兴趣的特定点的任何重要的反馈意见。
这是我如何定义“最佳”这个讨论的目的:
- 延迟 - 如果我使用这个控制视频流的相机,我想如果可能的话让我的往返时延小于100毫秒。 这是测量我的控制输入时,我看到了明显的变化的时间之间的时间。 稍后编辑了一段时间:另一件事要记住的是,摄像机控制可能是手动和自动的组合(事件触发)。 我们需要看到那些照片向右走,即使优质饲料分别存档。
- 成本 - 自由/开源比不自由要好。
- 可调节的编解码器参数 - 我需要能够调整某些情况下编解码器。 有时,一个高速低分辨率流实际上是更容易处理。
- “整合”与Java - 多大的麻烦是它钩住这个解决我的代码? 我在发送数据包通过套接字? 击中网址吗? 安装的Direct3D / JNI的组合?
- 在Windows / Linux的/两? - 因为我要传递给OS的几种口味,但有可能是一个解决方案是最佳的一个,但不是其他我宁愿一个操作系统无关的解决方案。
注:我知道其他图像/视频采集编解码器,这是不是这个问题的重点。 我特别不感兴趣,流式API(如MPEG4)由于帧精度的损失。 但是,如果有我的问题解决方案,提供另一种帧精确的数据流,请插入内容。
跟进这个问题:在这一点上,我强烈地倾向于购买家电如Axis视频编码器 ,而不是试图捕捉视频软件或PC上直接。 但是,如果有人有替代品,我很乐意听到他们的声音。
这JavaCV实现正常工作。
码:
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class CaptureImage {
private static void captureFrame() {
// 0-default camera, 1 - next...so on
final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
try {
grabber.start();
IplImage img = grabber.grab();
if (img != null) {
cvSaveImage("capture.jpg", img);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
captureFrame();
}
}
也有张贴在查看实时视频从摄像机。而配置JavaCV:
我认为这将满足您的要求。
关于JMF的死湖,你是知道的FMJ实施 ? 我不知道是否有资格作为“最佳”的解决方案,但它可能是值得加入了讨论。
下面显示的使用非常简单的实现张建东框架 。 使用马文,你可以轻松地添加实时视频处理。
import javax.swing.JFrame;
import marvin.gui.MarvinImagePanel;
import marvin.image.MarvinImage;
import marvin.video.MarvinJavaCVAdapter;
import marvin.video.MarvinVideoInterface;
public class SimpleVideoTest extends JFrame implements Runnable{
private MarvinVideoInterface videoAdapter;
private MarvinImage image;
private MarvinImagePanel videoPanel;
public SimpleVideoTest(){
super("Simple Video Test");
// Create the VideoAdapter and connect to the camera
videoAdapter = new MarvinJavaCVAdapter();
videoAdapter.connect(0);
// Create VideoPanel
videoPanel = new MarvinImagePanel();
add(videoPanel);
// Start the thread for requesting the video frames
new Thread(this).start();
setSize(800,600);
setVisible(true);
}
public static void main(String[] args) {
SimpleVideoTest t = new SimpleVideoTest();
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void run() {
while(true){
// Request a video frame and set into the VideoPanel
image = videoAdapter.getFrame();
videoPanel.setImage(image);
}
}
}
另一个例子申请实时视频处理多个算法。
这是我JavaCV实现高分辨率视频输出和帧速率比其他解决方案没有明显下降(只有当我的摄像头重新调整做我听到轻微的下降,只是一瞬间,虽然)。
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.JFrame;
import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.OpenCVFrameRecorder;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
public class Webcam implements Runnable {
IplImage image;
static CanvasFrame frame = new CanvasFrame("Web Cam");
public static boolean running = false;
public Webcam()
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void run()
{
try
{
grabber.setImageWidth(800);
grabber.setImageHeight(600);
grabber.start();
while (running)
{
IplImage cvimg = grabber.grab();
BufferedImage image;
if (cvimg != null)
{
// opencv_core.cvFlip(cvimg, cvimg, 1); // mirror
// show image on window
image = cvimg.getBufferedImage();
frame.showImage(image);
}
}
grabber.stop();
frame.dispose();
} catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String... args)
{
Webcam webcam = new Webcam();
webcam.start();
}
public void start()
{
new Thread(this).start();
running = true;
}
public void stop()
{
running = false;
}
}
你曾经看着Processing.org ? 它基本上是用于开发“艺术气息”的应用和物理计算平台的简化应用程序的框架,但它是基于Java和您可以向下挖下的“真实”的Java。
它浮现在脑海的原因是,有几个视频库,它们基本上是Java组件进行处理(至少我认为他们是-该网站拥有所有你可能需要的技术信息)。 有一个教程上使用处理库和工具在Eclipse IDE中。 也有许多例子在视频采集和处理。
即使你不能直接使用的库,处理是工作了算法一种伟大的语言/环境。 有图像和视频捕捉和实时处理有几个很好的例子。
文章来源: What is the best method to capture images from a live video device for use by a Java-based application?