- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一些上下文;该程序最初是为与 USB 相机配合使用而构建的 - 但由于需要在相机所在的位置和计算机所在的位置之间进行设置,因此切换到通过网络运行的相机更有意义。现在我正在尝试转换该程序以完成此任务,但迄今为止我的努力结果不佳。我也在 OpenCV forums 上问过同样的问题.帮我监视我的邻居! (当然,这是经过他们的许可!):D
我正在使用:
warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:529)
522 bool CvCapture_FFMPEG::open( const char* _filename )
523 {
524 unsigned i;
525 bool valid = false;
526
527 close();
528
529 #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
530 int err = avformat_open_input(&ic, _filename, NULL, NULL);
531 #else
532 int err = av_open_input_file(&ic, _filename, NULL, 0, NULL);
533 #endif
...
616 }
1 #include <fstream> // File input/output
2 #include <iostream> // cout / cin / etc
3 #include <windows.h> // Windows API stuff
4 #include <stdio.h> // More input/output stuff
5 #include <string> // "Strings" of characters strung together to form words and stuff
6 #include <cstring> // "Strings" of characters strung together to form words and stuff
7 #include <streambuf> // For buffering load files
8 #include <array> // Functions for working with arrays
9 #include <opencv2/imgproc/imgproc.hpp> // Image Processor
10 #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
11 #include <opencv2/highgui/highgui.hpp> // OpenCV window I/O
12 #include "opencv2/calib3d/calib3d.hpp"
13 #include "opencv2/features2d/features2d.hpp"
14 #include "opencv2/opencv.hpp"
15 #include "resource.h" // Included for linking the .rc file
16 #include <conio.h> // For sleep()
17 #include <chrono> // To get start-time of program.
18 #include <algorithm> // For looking at whole sets.
19
20 #ifdef __BORLANDC__
21 #pragma argsused
22 #endif
23
24 using namespace std; // Standard operations. Needed for most basic functions.
25 using namespace std::chrono; // Chrono operations. Needed getting starting time of program.
26 using namespace cv; // OpenCV operations. Needed for most OpenCV functions.
27
28 string videoFeedAddress = "";
29 VideoCapture videoFeedIP = NULL;
30 Mat clickPointStorage; //Artifact from original program.
31
32 void displayCameraViewTest()
33 {
34 VideoCapture cv_cap_IP;
35 Mat color_img_IP;
36 int capture;
37 IplImage* color_img;
38 cv_cap_IP.open(videoFeedAddress);
39 Sleep(100);
40 if(!cv_cap_IP.isOpened())
41 {
42 cout << "Video Error: Video input will not work.\n";
43 cvDestroyWindow("Camera View");
44 return;
45 }
46 clickPointStorage.create(color_img_IP.rows, color_img_IP.cols, CV_8UC3);
47 clickPointStorage.setTo(Scalar(0, 0, 0));
48 cvNamedWindow("Camera View", 0); // create window
49 IplImage* IplClickPointStorage = new IplImage(clickPointStorage);
50 IplImage* Ipl_IP_Img;
51
52 for(;;)
53 {
54 cv_cap_IP.read(color_img_IP);
55 IplClickPointStorage = new IplImage(clickPointStorage);
56 Ipl_IP_Img = new IplImage(color_img_IP);
57 cvAdd(Ipl_IP_Img, IplClickPointStorage, color_img);
58 cvShowImage("Camera View", color_img); // show frame
59 capture = cvWaitKey(10); // wait 10 ms or for key stroke
60 if(capture == 27 || capture == 13 || capture == 32){break;} // if ESC, Return, or space; close window.
61 }
62 cv_cap_IP.release();
63 delete Ipl_IP_Img;
64 delete IplClickPointStorage;
65 cvDestroyWindow("Camera View");
66 return;
67 }
68
69 int main()
70 {
71 while(1)
72 {
73 cout << "Please Enter Video-Feed Address: ";
74 cin >> videoFeedAddress;
75 if(videoFeedAddress == "exit"){return 0;}
76 cout << "\nvideoFeedAddress: " << videoFeedAddress << endl;
77 displayCameraViewTest();
78 if(cvWaitKey(10) == 27){return 0;}
79 }
80 return 0;
81 }
TLDR: Network Camera and OpenCV are not cooperating. I'm unsure if it's the address I'm using to direct the program to the camera or the command I'm using - but no adjustment I make seems to improve the result beyond what I've already done! Now my neighbors will go unwatched!
最佳答案
有多种方法可以获取视频。 ffmpeg 不是唯一的方法,尽管它最方便。要诊断 ffmpeg 是否能够读取流,您应该使用独立的 ffmpeg/ffplay 尝试打开 url。如果能直接打开,可能是url格式的一些小问题,比如双斜线(rtsp://IPADDRESS:554/live1.sdp
而不是rtsp://IPADDRESS:554//live1.sdp
)。如果它不能直接打开它,它可能需要一些额外的命令行开关才能使其工作。然后,您需要修改 opencv 的 ffmpeg 实现@第 529 行以将选项传递给 avformat_open_input
.这可能需要进行相当多的调整,然后才能获得工作程序。
您还可以通过查阅手册来检查相机是否提供 http mjpeg 流。我没有你正在使用的相机。所以我在这方面帮不上什么忙。
或者,我在下面有两个建议,由于您提到 vlc 正在运行,它们可能会帮助您相对快速地启动和运行。
方法一
我假设您至少可以使用现有的 opencv/ffmpeg 组合打开 mjpeg url。由于 vlc 正在工作,只需使用 vlc 将视频转码为 mjpeg,例如vlc.exe --ignore-config -I dummy rtsp://admin:admin@10.10.204.111 --sout=#transcode"{vcodec=MJPG,vb=5000,scale=1,acodec=none}:std{access=http,mux=raw,dst=127.0.0.1:9080/frame.mjpg}"
之后使用 http://127.0.0.1:9080/frame.mjpg
使用 opencv VideoCapture 抓取帧。这只需要您有一个转码器程序,可以将传入的流转换为 mjpeg。
方法二
您也可以直接以编程方式使用 vlc api。以下代码使用 vlc 来抓取帧。编译的相关信息
#include "opencv2/highgui/highgui.hpp"
#include <windows.h>
#include <vlc/vlc.h>
using namespace cv;
struct ctx
{
Mat* image;
HANDLE mutex;
uchar* pixels;
};
bool isRunning=true;
Size getsize(const char* path)
{
libvlc_instance_t *vlcInstance;
libvlc_media_player_t *mp;
libvlc_media_t *media;
const char * const vlc_args[] = {
"-R",
"-I", "dummy",
"--ignore-config",
"--quiet",
};
vlcInstance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
media = libvlc_media_new_location(vlcInstance, path);
mp = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);
libvlc_video_set_callbacks(mp, NULL, NULL, NULL, NULL);
libvlc_video_set_format(mp, "RV24",100,100, 100 * 24 / 8); // pitch = width * BitsPerPixel / 8
libvlc_media_player_play(mp);
Sleep(2000);//wait a while so that something get rendered so that size info is available
unsigned int width=640,height=480;
libvlc_video_get_size(mp,0,&width,&height);
if(width==0 || height ==0)
{
width=640;
height=480;
}
libvlc_media_player_stop(mp);
libvlc_release(vlcInstance);
libvlc_media_player_release(mp);
return Size(width,height);
}
void *lock(void *data, void**p_pixels)
{
struct ctx *ctx = (struct ctx*)data;
WaitForSingleObject(ctx->mutex, INFINITE);
*p_pixels = ctx->pixels;
return NULL;
}
void display(void *data, void *id){
(void) data;
assert(id == NULL);
}
void unlock(void *data, void *id, void *const *p_pixels)
{
struct ctx *ctx = (struct ctx*)data;
Mat frame = *ctx->image;
if(frame.data)
{
imshow("frame",frame);
if(waitKey(1)==27)
{
isRunning=false;
//exit(0);
}
}
ReleaseMutex(ctx->mutex);
}
int main( )
{
string url="rtsp://admin:admin@10.10.204.111";
//vlc sdk does not know the video size until it is rendered, so need to play it a bit so that size is known
Size sz = getsize(url.c_str());
// VLC pointers
libvlc_instance_t *vlcInstance;
libvlc_media_player_t *mp;
libvlc_media_t *media;
const char * const vlc_args[] = {
"-R",
"-I", "dummy",
"--ignore-config",
"--quiet",
};
vlcInstance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
media = libvlc_media_new_location(vlcInstance, url.c_str());
mp = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);
struct ctx* context = ( struct ctx* )malloc( sizeof( *context ) );
context->mutex = CreateMutex(NULL, FALSE, NULL);
context->image = new Mat(sz.height, sz.width, CV_8UC3);
context->pixels = (unsigned char *)context->image->data;
libvlc_video_set_callbacks(mp, lock, unlock, display, context);
libvlc_video_set_format(mp, "RV24", sz.width, sz.height, sz.width * 24 / 8); // pitch = width * BitsPerPixel / 8
libvlc_media_player_play(mp);
while(isRunning)
{
Sleep(1);
}
libvlc_media_player_stop(mp);
libvlc_release(vlcInstance);
libvlc_media_player_release(mp);
free(context);
return 0;
}
关于c++ - OpenCV 和网络摄像机 - 或者 - 如何监视邻居?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529620/
如何同时管理多个 GoPro 摄像机?我想同时串流三个 GoPro 摄像机的三个视频,并将视频记录在硬盘上。 我用 Java 为一个 GoPro 编写了一个工具,它可以正常工作。 请帮帮我! 这是代码
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 去年关
当插入的外部麦克风插孔兼容 TRRS(通常是 2 个标准之一:CTIA 和 OMTP)时,大多数 Android 录音应用程序会自动识别音频输入。 尽管我可能会进行搜索,但我还没有遇到使用外接麦克风录
当 GoPro 相机插入我的 Fedora 笔记本电脑时,我可以通过 GUI 访问它 - 它显示为 StillImage(在设备下),但我似乎无法通过命令行访问它。按 CTRL+L 给出的位置为“gp
我正在尝试使用 Javafx 和 OpenCV 通过无线访问网络摄像头(Axis M1013),以便为我的 FRC 团队运行视觉处理。当我运行我的代码时,我可以访问我使用 Scenebuilder 制
我有一台带麦克风的大华网络摄像机。我想在现场广播之类的网站上播放音频流。 我有一个树莓派,我打算将它与 ffmpeg 一起使用,但我在弥合它与我的网站之间的差距以形成音频流方面并没有取得太大的成功。
试图通过FFmpeg正确抓取一个IP摄像机,海康威视品牌。 这就是 FFmpeg 的情况: "ffmpeg", "-rtsp_transport", "tcp",
我有 3 台 ONVIF 摄像机(博世、松下和安讯士)。我使用 WS-Discovery 查找摄像头,并且可以使用 GetDeviceInformation 从摄像头获取信息。我的问题是,当我尝试从中
我正在尝试使用 opencv java 从网络摄像头 (sony snc p1) 获取图像以进行运动检测。该流采用 mjpeg 格式,我正在使用 opencv 的 VideoCapture 尝试检索图
我正在尝试使用 OpenCV 和 Java 从 IP 摄像机访问 RTSP 视频流。我可以使用以下格式的 VLC 播放器访问流:rtsp://192.168.1.10:554/rtsp_live0 但
我正在尝试让 IP 摄像头流在浏览器中运行,并最终在电话中运行。但是,我在通过 ffmpeg 访问 RTSP 流时遇到了问题。 我正在运行下面的命令,替换正确的信息。我将相机更改为静态 IP 地址并将
任何人请帮助我理解这段代码。这是从 android 的 IPCamera 中获取的,我从 googlecode 中获取的。我试图弄清楚的代码是: public NanoHTTPD( int port,
我想通过 WIFI 从 PC 上控制一个基于 arduino 的小型机器人和一个 IP 摄像头,但我已经浏览互联网有一段时间了,我仍然不知道如何设置它。 我想在机器人上安装一个WIFI路由器,例如th
我有一台罗技 PTZ USB 摄像头。我已经使用 WebRtc 准备了视频通话功能。现在我需要的是在浏览器中添加平移、倾斜和缩放控件,以便用户可以根据需要控制摄像机。 是否可以使用JavaScript
#include #include #include int main(int, char**) { cv::VideoCapture vcap; cv::Mat image;
我使用了 onvifcpplib 库,您可以在以下位置找到它: https://github.com/veyesys/onvifcpplib我想用这个库编写 IP 摄像机发现(它可以在网络上找到 IP
我将在不同的计算机上使用多个客户端来查看 IP 摄像机流 url 的视频。因为网络摄像头对连接的客户端数量有限制,所以我想为此设置一个流媒体。我用谷歌搜索并尝试使用不同命令行选项的 GStreamer
我使用以下命令从 RTSP h264 编解码器获取帧。我无法从网络摄像机中获取帧。 $ ffmpeg -i rtsp://xxxx:yyy@192.168.1.yy:xx/tcp/av0_0 -f i
任何现有的 java 或 matlab 库 与背景进行图像相减图片 清除阴影 进行膨胀和腐 eclipse 来计算如何一个房间里有很多人? 最佳答案 OpenCV 将帮助您做您想做的事情,并且有 Ja
我正在使用以下命令通过 gstreamer 从 ip 摄像头获取图像。 gst-launch-0.10 -v rtspsrc location="rtsp://ipaddress :554/user=
我是一名优秀的程序员,十分优秀!