Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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/9/opencv/3.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++ [OpenCV][C+;+;]仅记录检测到的运动_C++_Opencv - Fatal编程技术网

C++ [OpenCV][C+;+;]仅记录检测到的运动

C++ [OpenCV][C+;+;]仅记录检测到的运动,c++,opencv,C++,Opencv,我正在做一个项目来检测摄像机的运动。 当检测到运动时,我需要开始录制视频,例如: 检测到运动时录制 停止运动检测后,继续录制10秒钟 我有一个工作示例,它只检测运动并在运动部件上绘制矩形。 我搜索了一些关于如何在检测到运动时进行记录的示例,但没有找到好的结果 这是我的工作代码: #include <iostream> #include <sstream> #include <opencv4/opencv2/imgproc.hpp> #include <

我正在做一个项目来检测摄像机的运动。 当检测到运动时,我需要开始录制视频,例如:

  • 检测到运动时录制
  • 停止运动检测后,继续录制10秒钟
我有一个工作示例,它只检测运动并在运动部件上绘制矩形。
我搜索了一些关于如何在检测到运动时进行记录的示例,但没有找到好的结果

这是我的工作代码:

#include <iostream>
#include <sstream>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/videoio.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/video.hpp>
#include <unistd.h>

using namespace cv;
using namespace std;

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

int main(int argc, char* argv[])
{

    //create Background Subtractor objects
    Ptr<BackgroundSubtractor> pBackSub;
    pBackSub = createBackgroundSubtractorMOG2();

    VideoCapture capture(0);
    if (!capture.isOpened()){
        //error in opening the video input
        cerr << "Unable to open: " << endl;
        return 0;
    }

    Mat frame, fgMask;

    sleep(3);

    while (true) {
        capture >> frame;
        if (frame.empty())
            break;
        
        //update the background model
        pBackSub->apply(frame, fgMask);
        
        imshow("FG Mask", fgMask);

        RNG rng(12345);
        findContours(fgMask, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0, 0));

        vector<Rect>boundRect (contours.size());
        vector<vector<Point> > contours_poly( contours.size() );

        for (int i = 0; i < contours.size();i++) {
            if( contourArea(contours[i])< 500)
            {
                continue;
            }

            putText(frame, "Motion Detected", Point(10,20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2);
            approxPolyDP( contours[i], contours_poly[i], 3, true );
            boundRect[i] = boundingRect( contours_poly[i] );
            Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) );
            rectangle( frame, boundRect[i].tl(), boundRect[i].br(), color, 2 );
        }

        imshow("Frame", frame);
        int keyboard = waitKey(30);
        if (keyboard == 'q' || keyboard == 27)
            break;
    }
    return 0;
}
绘制完矩形后,我将帧写入视频:

outputVideo.write(frame);
但是在那之后,视频是空的并且崩溃了

我已经看过了,但没有找到一个例子

我怎样才能做到这一点

谢谢, 我解决了这个问题

我打开了特定尺寸(320240)的输出视频,并保存了更大的捕获帧。 因此,解决方案是调整捕获帧的大小以适应输出视频

如果有人感兴趣,以下是最终解决方案:

  • 通过以下功能将笔记本电脑摄像头转换为IP摄像头:

  • 以下是源代码:

    #include <iostream>
    #include <sstream>
    #include <opencv4/opencv2/imgproc.hpp>
    #include <opencv4/opencv2/videoio.hpp>
    #include <opencv4/opencv2/highgui.hpp>
    #include <opencv4/opencv2/video.hpp>
    #include <unistd.h>
    
    using namespace cv;
    using namespace std;
    
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    
    int main(int argc, char* argv[])
    {
        //create Background Subtractor objects
        Ptr<BackgroundSubtractor> pBackSub;
        pBackSub = createBackgroundSubtractorMOG2();
    
     const std::string videoStreamAddress = "http://192.168.20.100:56000/mjpeg";
     cv::VideoCapture vcap;
    
     if(!vcap.open(videoStreamAddress)) {
         std::cout << "Error opening video stream or file" << std::endl;
         return -1;
     }
    
     Mat frame, fgMask;
    
     int frameWidth = 320;
     int frameHeight = 240;
    
     cv::Size frameSize = cv::Size(frameWidth, frameHeight);
    
     /* Output file */
     int codec = cv::VideoWriter::fourcc('M', 'P', '4', 'V');
     cv::VideoWriter outputVideo;
     outputVideo.open("rr.mp4", codec, vcap.get(cv::CAP_PROP_FPS), frameSize, true);
    
     sleep(3);
    
     while (true) {
         vcap >> frame;
         if (frame.empty())
             break;
    
         //update the background model
         pBackSub->apply(frame, fgMask);
    
         imshow("FG Mask", fgMask);
    
         RNG rng(12345);
         findContours(fgMask, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0, 0));
    
         vector<Rect>boundRect (contours.size());
         vector<vector<Point> > contours_poly( contours.size() );
    
         for (int i = 0; i < contours.size();i++) {
             if( contourArea(contours[i])< 500)
             {
                 continue;
             }
    
             putText(frame, "Motion Detected", Point(10,20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2);
             approxPolyDP( contours[i], contours_poly[i], 3, true );
             boundRect[i] = boundingRect( contours_poly[i] );
             Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) );
             rectangle( frame, boundRect[i].tl(), boundRect[i].br(), color, 2 );
             resize(frame, frame, frameSize);
             outputVideo.write(frame);
         }
    
         imshow("Frame", frame);
         int keyboard = waitKey(30);
         if (keyboard == 'q' || keyboard == 27)
             break;
     }
    
     outputVideo.release();
     return 0;
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    使用名称空间cv;
    使用名称空间std;
    矢量等值线;
    向量层次;
    int main(int argc,char*argv[])
    {
    //创建背景减法器对象
    Ptr-pBackSub;
    pBackSub=createBackgroundSubtractorMOG2();
    常量std::字符串videoStreamAddress=”http://192.168.20.100:56000/mjpeg";
    视频捕获vcap;
    如果(!vcap.open(videoStreamAddress)){
    std::cout框架;
    if(frame.empty())
    打破
    //更新背景模型
    pBackSub->apply(帧,fgMask);
    imshow(“FG遮罩”,FG遮罩);
    RNG RNG(12345);
    findContours(fgMask、轮廓、层次、外部检索、链近似、点(0,0));
    vectorboundRect(contours.size());
    向量等高线_多边形(等高线.size());
    对于(int i=0;i
    }

进一步改善建议:

  • 确保灯光不是运动检测的一部分
  • 打开具有相同捕获尺寸的输出视频

“我搜索了如何在检测到运动时记录的示例”。你说得太具体了。您找到了检测运动的代码。好。这是第一次搜索。第二个搜索如果为第二部分,如何录制视频。例如,当程序启动时,仅记录10秒。最后,作为一名程序员,您可以将这两个示例结合起来。我将这两个示例结合在一起,我可以在视频开始时开始录制,但是图像如果没有特定的运动(例如:2天的空房间),录制将是全部2天,但是当检测到运动时(例如:一只狗进来),此时我需要开始录制视频,因此,最终的结果是仅检测到运动的视频块。
#include <iostream>
#include <sstream>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/videoio.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/video.hpp>
#include <unistd.h>

using namespace cv;
using namespace std;

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

int main(int argc, char* argv[])
{
    //create Background Subtractor objects
    Ptr<BackgroundSubtractor> pBackSub;
    pBackSub = createBackgroundSubtractorMOG2();

 const std::string videoStreamAddress = "http://192.168.20.100:56000/mjpeg";
 cv::VideoCapture vcap;

 if(!vcap.open(videoStreamAddress)) {
     std::cout << "Error opening video stream or file" << std::endl;
     return -1;
 }

 Mat frame, fgMask;

 int frameWidth = 320;
 int frameHeight = 240;

 cv::Size frameSize = cv::Size(frameWidth, frameHeight);

 /* Output file */
 int codec = cv::VideoWriter::fourcc('M', 'P', '4', 'V');
 cv::VideoWriter outputVideo;
 outputVideo.open("rr.mp4", codec, vcap.get(cv::CAP_PROP_FPS), frameSize, true);

 sleep(3);

 while (true) {
     vcap >> frame;
     if (frame.empty())
         break;

     //update the background model
     pBackSub->apply(frame, fgMask);

     imshow("FG Mask", fgMask);

     RNG rng(12345);
     findContours(fgMask, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0, 0));

     vector<Rect>boundRect (contours.size());
     vector<vector<Point> > contours_poly( contours.size() );

     for (int i = 0; i < contours.size();i++) {
         if( contourArea(contours[i])< 500)
         {
             continue;
         }

         putText(frame, "Motion Detected", Point(10,20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2);
         approxPolyDP( contours[i], contours_poly[i], 3, true );
         boundRect[i] = boundingRect( contours_poly[i] );
         Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) );
         rectangle( frame, boundRect[i].tl(), boundRect[i].br(), color, 2 );
         resize(frame, frame, frameSize);
         outputVideo.write(frame);
     }

     imshow("Frame", frame);
     int keyboard = waitKey(30);
     if (keyboard == 'q' || keyboard == 27)
         break;
 }

 outputVideo.release();
 return 0;