c,opencv - 通过ip访问相机JPG图像

时间:2012-01-14 18:46:26

标签: c opencv

我已经在 OpenCV 2.3.1 中阅读了许多关于通过IP传输图像的线程,但我仍然无法使我的程序正常工作。

我从https://market.android.com/details?id=com.pas.webcam&hl=en下载了适用于Android的IP网络摄像头,并且最近学习了OpenCV以从我的Android手机相机中检索图像。

其内置手册表示手机摄像头的图像位于http://the.phone.ip.address:8080/shot.jpg。我已经多次从浏览器打开它,它看起来总是很好。我还手动构建了OpenCV,支持 FFmpeg

到目前为止,我已经尝试了

CvCapture* webcam = cvCaptureFromFile("http://192.168.1.220:8080/shot.jpg");

但它返回NULL并输出

[image2 @ 0xd701e0]Could not find codec parameters (Video: mjpeg, yuv420p)

我也尝试用rtsp替换http,但它仍然不起作用。我还试图用其他图像网址(一个直接链接到谷歌图像的随机图像,一个来自localhost)替换网址,它总是以段错误为止。

这是我的完整资料来源

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char* argv[])
{ 
  CvCapture* webcam = cvCaptureFromFile("http://192.168.1.220:8080/shot.jpg");
  if(!webcam)
    {
      fprintf(stderr, "cannot open webcam\n");
      return 1;
    }

  IplImage* img = cvQueryFrame(webcam);
  if(!img)
    {
      fprintf(stderr, "cannot get image\n");
      return 1;
    }

  cvNamedWindow("test", CV_WINDOW_AUTOSIZE);
  cvShowImage("test", img);
  cvWaitKey(0);
  cvReleaseImage(&img);
  /**/ cvReleaseCapture(&webcam); /**/
  cvDestroyWindow("test");
  return 0;
}

OpenCV真的可以通过IP读取图像,还是我错过了什么?

3 个答案:

答案 0 :(得分:4)

我对openCV并不是特别熟悉,但是花了一分钟看文档,有两件事突然袭来我: -

首先,你不会在这里处理真正的视频流:你的Android应用程序只是使当前的JPEG捕获可用,你必须不断重新采样。因为它是图像,而不是视频,所以应该使用cvLoadImage()代替。

其次,您传递的是URL,而不是文件名。在尝试使用openCV打开图像之前,您需要一种方法来使用HTTP将图像提取到本地文件。

我建议您从浏览器本地保存JPEG文件的快照,然后尝试使用该代码。从本地文件开始工作后,请尝试添加HTTP提取内容。

答案 1 :(得分:2)

虽然它会/很棒/如果支持它,它似乎不是。请注意,操作系统处理打开文件的方式与URL不同(显然),因此默认情况下不支持这种操作 - 您不能fopen() URL。如果OpenCV特别支持它,那么它是可能的,但我有一些证据表明它们没有:

以下是您可以做的事情:

  • 以其他方式下载图片 - 可能是使用system()调用wget,也许是使用库将文件下载到内存中
  • 至少有一位消息来源表示您可以使用Processing's loadImage()从网址加载。

答案 2 :(得分:0)

进一步搜索罗迪的答案使得我已经让事情适合我。

不幸的是,这不是很好,只有windows解决方案。但是从这个应用程序获取jpg的唯一方法是以某种方式获取http。有很多lib可以帮助例如libcurl,boost :: asio。 我已经使用urlmon.lib让事情适合我:

#inlcude <opencv2\opencv.hpp>
#include <UrlMon.h>
#include <tchar.h>
#pragma comment(lib,"urlmon.lib")

int main()
{
        for(;;)
        {
              HRESULT hr = URLDownloadToFile(NULL,_T("http://192.168.1.104:8080/shot.jpg"),
                                             _T("D:/test.jpg"),0,NULL);
              IplImage *test = cvLoadImage("D:/test.jpg");
              cvShowImage("test",test);
              cvWaitKey(30);
        }
}

这个应用程序也可以像我在评论中建议的那样流式传输mjpg。 OpenCV VideoStream似乎可以选择按照建议Stream live video in openCv from localHost port (http://192.168.1.1:8080)OpenCV with Network Cameras进行读取。 我也试过这个解决方案,但得到mp3 header missing。我希望有人通过使用此应用程序中的录像带提供一些答案。