我想把我的应用程序在相机连接的等待模式下

问题描述:

我的小程序用于读取相机馈送,它工作正常。但是当运行应用程序时,当相机连接丢失时,应用程序终止。实际上,应用程序控制无法从cvCaptureFromFile()函数中发出,并且经过一段时间后,它会导致错误。当运行应用程序时,当相机连接丢失时,我想控制cvCaptureFromFile()函数意味着我想让我的应用程序处于等待模式以便下一帧来自相机,并且当有相机连接时,我的应用程序应该从相机自动开始读取帧。我想这样做。我尝试了很多,但无法获得任何解决方案。 我使用的是opencv 2.4.4版本。我想把我的应用程序在相机连接的等待模式下

我的cpp文件是提前

#include "stdafx.h" 
#include "cv.h" 
#include "cxcore.h" 
#include "highgui.h" 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <opencv2/imgproc/imgproc.hpp> 
#include "stdio.h" 

using namespace cv; 
using namespace std; 

char key; 
IplImage* frame = cvCreateImage(cvSize(640,360),8,3); 
int main() 
{ 

    IplImage *frame1; 
    back: 
    CvCapture* input = cvCaptureFromFile("rtsp://admin:[email protected]:554/ch1-s1?tcp"); 
    if(!input) 
    { 
     printf("\nWaiting for camera connection."); 
     goto back; 
    } 
    while(1) 
    { 
     frame1 = cvQueryFrame(input); 
     /*if(frame1 == NULL) 
      printf("\nCamera is disconnected.");*/  

     cvResize(frame1,frame,1); 
     cvShowImage("frame", frame); 
     key = cvWaitKey(10); 
     if (char(key) == 27) 
      break; 
    } 
    cvReleaseCapture(&input); 
    return 0; 
} 

感谢。

+0

检查这些相关答案以检查断开相机不能做到这一点我自己: http://*.com/questions/5637425/camera-connection-and-disconnection-catch http://*.com/questions/4028463/detecting-an-unplugged-capture-device-opencv – 2015-02-23 07:19:46

+0

首先,请停止使用opencv的不再维护的c-api。那么,不幸的是,你无能为力。一旦你的应用程序开始等待一个框架,它会这样做*永远*。 – berak 2015-02-23 12:01:35

+0

除了有什么他可以做的;这是在我指出的其他答案中完成的。当然,这不是微不足道的,但它似乎是可能的。 – 2015-02-23 16:19:29

我不知道它是否会帮助你,但尝试这个曾经...

1)如果连接相机到一个端口,那么你可以连续查询的是,它是活跃的?如果没有激活,则相机断开连接并相应地等待其激活。

+0

我正在使用IP摄像机,我认为当摄像机处于断开模式时,IP地址将不会ping,IP地址不会ping,因此我们无法检查端口。 – user2865434 2015-02-24 08:59:43

+0

你是说它是一个基于IP的摄像机,所以当它的IP不能ping通时,它本身意味着你的摄像机断开了连接。当你的摄像机IP没有ping时,你可以将你的应用程序置于等待模式,并且一旦得到回复知识产权,恢复你的appllication。 – User420 2015-03-10 17:41:20

+0

我的确如此,但我的应用程序不能从cvQueryFrame()函数中获得。 – user2865434 2015-03-12 04:41:53

我认为这个问题可能不是用cvCaptureFromFile()函数,而是用frame1 = cvQueryFrame(input)命令。您可以取消注释掉该命令下方的if语句,并说明是否已打印出相机断开连接。

很抱歉,但我目前还没有获得OpenCV库

+0

此外,关于berak的评论,这是不正确的,因为如果图像无法按照docs中指定的方式读取,函数应该返回NULL响应,http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html – Eni 2015-02-23 13:11:08

+0

即使语句未注释,相机断开连接时代码的执行也不会停止。它会等待一段时间,过一段时间后会出错。 – user2865434 2015-02-24 08:52:53

+0

它应该在尝试抓取框架后提供某种反馈。无论克里斯托弗彼得森提供的解决方案似乎是合理的。也取决于等待之前它抛出一个错误多长时间,你cal总是尝试把frame1 = cvQueryFrame(input);命令在尝试和捕获错误,所以当它抛出一个错误尝试重新连接到相机(即重复此命令CvCapture * input = cvCaptureFromFile(“rtsp:// admin:[email protected]:554/ch1-s1?tcp “);) – Eni 2015-02-24 11:25:47