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
- 确保灯光不是运动检测的一部分
- 打开具有相同捕获尺寸的输出视频
#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;