Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用rtsp摄像机流时opencv视频捕获延迟_C++_Multithreading_Opencv_Rtsp - Fatal编程技术网

C++ 使用rtsp摄像机流时opencv视频捕获延迟

C++ 使用rtsp摄像机流时opencv视频捕获延迟,c++,multithreading,opencv,rtsp,C++,Multithreading,Opencv,Rtsp,因此,我目前正在从事一个项目,需要在rtsp ip cam上进行面部识别,我成功地获得了rtsp提要,但当涉及到应用面部识别时,视频提要速度太慢,显示了很大的延迟,我甚至使用多线程使其变得更好,但没有成功,这是我的代码,我还是一个多线程问题的初学者,所以任何帮助都将不胜感激 #include <iostream> #include <thread> #include "opencv2/opencv.hpp" #include <vector> usi

因此,我目前正在从事一个项目,需要在rtsp ip cam上进行面部识别,我成功地获得了rtsp提要,但当涉及到应用面部识别时,视频提要速度太慢,显示了很大的延迟,我甚至使用多线程使其变得更好,但没有成功,这是我的代码,我还是一个多线程问题的初学者,所以任何帮助都将不胜感激

    #include <iostream>
#include <thread>
#include "opencv2/opencv.hpp"

#include <vector>
using namespace std;
using namespace cv;
void detect(Mat img, String strCamera) {
    string cascadeName1 = "C:\\ocv3.2\\Build\\install\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";
    CascadeClassifier facedetect;
    bool loaded1 = facedetect.load(cascadeName1);
    Mat original;
    img.copyTo(original);
    vector<Rect> human;
    cvtColor(img, img, CV_BGR2GRAY);
    equalizeHist(img, img);
    facedetect.detectMultiScale(img, human, 1.1, 2, 0 | 1, Size(40, 80), Size(400, 480));
    if (human.size() > 0)
    {
        for (int gg = 0; gg < human.size(); gg++)
        {
            rectangle(original, human[gg].tl(), human[gg].br(), Scalar(0, 0, 255), 2, 8, 0);
        }
    }
    imshow("Detect " + strCamera, original);
    int key6 = waitKey(40);
    //End of the detect
}
void stream(String strCamera) {
    VideoCapture cap(strCamera);
    if (cap.isOpened()) {
        while (true) {
            Mat frame;
            cap >> frame;
            resize(frame, frame, Size(640, 480));
            detect(frame, strCamera);
        }
    }
}
int main() {
    thread cam1(stream, "rtsp://admin:password@ipaddress:554/live2.sdp?tcp");
    thread cam2(stream, "rtsp://admin:password@ipaddress/live2.sdp?tcp");
    cam1.join();
    cam2.join();
    return 0;
}
#包括
#包括
#包括“opencv2/opencv.hpp”
#包括
使用名称空间std;
使用名称空间cv;
无效检测(材料img、字符串strcmera){
string cascadeName1=“C:\\ocv3.2\\Build\\install\\etc\\haarcascade\\haarcascade\u frontalface\u alt.xml”;
级联分类器人脸检测;
bool loaded1=facedetect.load(cascadeName1);
垫子原件;
影印副本(原件);
人类病媒;
CVT颜色(img、img、CV_bgr2灰色);
均衡器(img,img);
检测多尺度(img,人类,1.1,2,0 | 1,大小(40,80),大小(400480));
if(human.size()>0)
{
for(intgg=0;gg>框架;
调整大小(帧,帧,大小(640480));
检测(帧、strcmera);
}
}
}
int main(){
螺纹cam1(流rtsp://admin:password@IP地址:554/live2.sdp?tcp);
螺纹凸轮2(流,”rtsp://admin:password@ipaddress/live2.sdp?tcp“;
cam1.join();
cam2.join();
返回0;
}

我也有类似的问题,并且能够通过将帧捕获与图像处理完全隔离来解决这些问题。我还将OpenCV更新为最新版本(3.2.0),但我认为这也将解决早期版本的问题

void StreamLoop(String strCamera, LFQueue1P1C<Mat> *imageQueue, bool *shutdown) {
    VideoCapture cap(strCamera, CV_CAP_FFMPEG);
    Mat image;

    while(!(*shutdown) && cap.isOpened()){
        *cap >> image;
        imageQueue->Produce(image);
    }

}

int main(){
    Mat aImage1;
    bool shutdown(false);
    LFQueue1P1C<Mat> imageQueue;
    string rstp("rtsp://admin:password@ipaddress:554/live2.sdp?tcp");
    thread streamThread(StreamLoop, rtsp, &imageQueue, &shutdown);

...

    while(!shutdownCondition){
        if(imageQueue.Consume(aImage1)) {
            // Process Image
            resize(aImage1, aImage1, Size(640, 480));
            detect(aImage1, rtsp);
        }
    }

    shutdown = true;
    if(streamThread.joinable()) streamThread.join();

...
    return 0;
}
void StreamLoop(字符串strcmera,LFQueue1P1C*imageQueue,bool*shutdown){
视频捕获cap(strcmera、CV_cap_FFMPEG);
Mat图像;
而(!(*关闭)和&cap.isOpened(){
*cap>>图像;
imageQueue->product(图像);
}
}
int main(){
Mat目标1;
bool关机(假);
LFQueue1P1C-imageQueue;
字符串rstp(“rtsp://admin:password@IP地址:554/live2.sdp?tcp);
线程streamThread(StreamLoop、rtsp、&imageQueue、&shutdown);
...
而(!关机条件){
if(imageQueue.Consume(目标1)){
//处理图像
调整大小(目标1,目标1,大小(640480));
检测(目标1,rtsp);
}
}
关机=真;
if(streamThread.joinable())streamThread.join();
...
返回0;
}
OpenCV中的rtsp似乎存在一些问题,如果在拾取帧时出现轻微停顿,它很容易挂断。只要我不停地拿起帧,我就没有看到问题

另外,当摄像机直接连接到我的本地网络时,我没有这个问题。直到我们将它们部署到一个远程站点,我才开始遇到问题。将帧检索和处理分离成单独的线程解决了我的问题,希望其他人会发现这个解决方案很有用

注意:我使用的队列是一个自定义队列,用于将项目从一个线程传递到另一个线程。我发布的代码是从我的原始代码修改而来的,以使其更具可读性并适用于此问题

我仍然是一个多线程的初学者,所以任何帮助都将不胜感激


拥有无法退出的线程将在将来给您带来问题。即使是测试代码,也要养成确保代码有退出路径的习惯。举个例子:你可以在以后拷贝和粘贴一段代码,忘记其中有一个无限循环,然后会引起巨大的痛苦,试图追查你为什么会神秘地崩溃或者你的资源被锁起来。

< P>我不是C++开发人员,但是我在java中也遇到了同样的问题。我通过在读取相机帧之前调用
VideoCapture.grab()
function解决了这个问题。根据OpenCV文档,抓取功能的使用是:

该功能的主要用途是在多摄像头环境中, 特别是当摄像机没有硬件同步时

此外,在java应用程序中,每次读取新帧时,都应该释放帧的
Mat
对象