我正在研究用于某些场景的半实时检测的图像处理问题.我的目标是让实时视频以某种方式在我的Java代码中作为Motion JPEG帧到达.
我熟悉Java Media Framework,遗憾的是,我认为我们可以认为这是一个有效的死API.我也熟悉Axis盒子,虽然我非常喜欢他们的解决方案,但我会很感激我对我特定兴趣点的任何批评性反馈.
这就是我为此讨论定义"最佳"的方式:
延迟 - 如果我使用此视频流控制摄像机,我希望尽可能保持我的往返延迟不到100毫秒.这是我的控制输入到我看到可见变化的时间之间的时间.稍后编辑:要记住的另一件事是相机控制可能是手动和自动(事件触发器)的组合.我们需要立即看到这些图片,即使高质量的饲料是单独存档的.
免费/开源比免费更好.
可调编解码器参数 - 我需要能够在某些情况下调整编解码器.有时,高速低分辨率流实际上更容易处理.
与Java"集成" - 将此解决方案挂钩到我的代码有多麻烦?我是通过套接字发送数据包吗?点击网址?安装Direct3D/JNI组合?
Windows/Linux /两者? - 我更喜欢与操作系统无关的解决方案,因为我必须提供多种类型的操作系统,但可能有一种解决方案最适合一种而不是另一种.
注意:我知道其他图像/视频捕获编解码器,这不是这个问题的焦点.由于帧精度的降低,我对流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(); } }
还有关于从Camera 观看实时视频的帖子.以及JavaCV的配置:
我认为这符合您的要求.