我已经在 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读取图像,还是我错过了什么?
答案 0 :(得分:4)
我对openCV并不是特别熟悉,但是花了一分钟看文档,有两件事突然袭来我: -
首先,你不会在这里处理真正的视频流:你的Android应用程序只是使当前的JPEG捕获可用,你必须不断重新采样。因为它是图像,而不是视频,所以应该使用cvLoadImage()
代替。
其次,您传递的是URL,而不是文件名。在尝试使用openCV打开图像之前,您需要一种方法来使用HTTP将图像提取到本地文件。
我建议您从浏览器本地保存JPEG文件的快照,然后尝试使用该代码。从本地文件开始工作后,请尝试添加HTTP提取内容。
答案 1 :(得分:2)
虽然它会/很棒/如果支持它,它似乎不是。请注意,操作系统处理打开文件的方式与URL不同(显然),因此默认情况下不支持这种操作 - 您不能fopen()
URL。如果OpenCV特别支持它,那么它是可能的,但我有一些证据表明它们没有:
以下是您可以做的事情:
system()
调用wget
,也许是使用库将文件下载到内存中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
。我希望有人通过使用此应用程序中的录像带提供一些答案。