C++ 如何在视频中跟踪前景并在其上绘制矩形
我正在做一个跟踪人的动作检测脚本。 我使用了前景函数MOG2,它做了我想做的事情。在下一步中,我想在移动的人周围画一个矩形,但运行它时会出错 有没有办法解决这个问题 错误:C++ 如何在视频中跟踪前景并在其上绘制矩形,c++,opencv,object-detection,opencv3.0,C++,Opencv,Object Detection,Opencv3.0,我正在做一个跟踪人的动作检测脚本。 我使用了前景函数MOG2,它做了我想做的事情。在下一步中,我想在移动的人周围画一个矩形,但运行它时会出错 有没有办法解决这个问题 错误: OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /home/shar/opencv/modules/core/src/array.cpp, line
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /home/shar/opencv/modules/core/src/array.cpp, line 2494
terminate called after throwing an instance of 'cv::Exception'
what(): /home/shar/opencv/modules/core/src/array.cpp:2494: error: (-206) Unrecognized or unsupported array type in function cvGetMat
Aborted
这是我的代码:
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
//打开视频文件
cv::视频捕获(0);
cv::垫架;
席色;
//前景二元图像
cv::Mat前景;
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
cv::namedWindow(“提取前景”);
矢量轮廓;//用于存储轮廓的矢量
向量层次;
findContours(框架、轮廓、层次、CV_-RETR_-CCOMP、CV_-CHAIN_-Abrox_-SIMPLE);
//检查视频是否成功打开
如果(!capture.isOpened())
返回0;
//当前视频帧
//澳大利亚项目的混合
//与所有默认参数一起使用
cv::Ptr pMOG2=cv::createBackgroundSubtractorMOG2();
bool-stop(假);
//测试边界框
//FORALL框架视频
当(!停止){
//ReadNextFrameFany
如果(!捕获.读取(帧))
打破
//更新背景
//安德烈机场
float learningRate=0.01;//或其他
cv::Mat前景;
pMOG2->apply(帧、前景、学习率);
//学习率
//互补图像
cv::threshold(前景,前景,128255,cv::THRESH_BINARY_INV);
//展示前景
对于(int i=0;i最大面积){
最大面积=a;cout您的代码失败,因为您正在调用帧上的findContours
,直到while
循环才初始化
您在查找最大轮廓时也会遇到问题,因为在每次迭代时都没有重置最大轮廓面积
和最大轮廓索引
,因此如果您在当前帧中找不到轮廓,它将失败
这段代码应该是你想要做的。
你可以找到一个相关的答案。
这里的代码是OpenCV 3.0.0的端口,加上使用形态学open去除噪声
#include <opencv2\opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
Ptr<BackgroundSubtractorMOG2> bg = createBackgroundSubtractorMOG2(500, 16, false);
VideoCapture cap(0);
Mat3b frame;
Mat1b fmask;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3));
for (;;)
{
// Capture frame
cap >> frame;
// Background subtraction
bg->apply(frame, fmask, -1);
// Clean foreground from noise
morphologyEx(fmask, fmask, MORPH_OPEN, kernel);
// Find contours
vector<vector<Point>> contours;
findContours(fmask.clone(), contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
if (!contours.empty())
{
// Get largest contour
int idx_largest_contour = -1;
double area_largest_contour = 0.0;
for (int i = 0; i < contours.size(); ++i)
{
double area = contourArea(contours[i]);
if (area_largest_contour < area)
{
area_largest_contour = area;
idx_largest_contour = i;
}
}
if (area_largest_contour > 200)
{
// Draw
Rect roi = boundingRect(contours[idx_largest_contour]);
drawContours(frame, contours, idx_largest_contour, Scalar(0, 0, 255));
rectangle(frame, roi, Scalar(0, 255, 0));
}
}
imshow("frame", frame);
imshow("mask", fmask);
if (cv::waitKey(30) >= 0) break;
}
return 0;
}
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main(int argc,char*argv[])
{
Ptr bg=createBackgroundSubtractorMOG2(500,16,false);
视频捕获上限(0);
Mat3b框架;
Mat1b fmask;
Mat kernel=getStructuringElement(变形,大小(3,3));
对于(;;)
{
//捕获帧
cap>>框架;
//背景减法
bg->apply(帧,fmask,-1);
//清除前景中的噪音
morphologyEx(fmask、fmask、MORPH_OPEN、kernel);
//寻找轮廓
矢量等值线;
findContours(fmask.clone()、等高线、CV_RETR_树、CV_CHAIN_近似_SIMPLE);
如果(!contours.empty())
{
//获得最大轮廓
int idx_最大_轮廓=-1;
双面积最大轮廓=0.0;
对于(int i=0;i200)
{
//画
Rect roi=边界Rect(等高线[idx_最大等高线]);
绘制等高线(帧、等高线、idx_最大等高线、标量(0,0,255));
矩形(帧,roi,标量(0,255,0));
}
}
imshow(“框架”,框架);
imshow(“掩码”,fmask);
如果(cv::waitKey(30)>=0)中断;
}
返回0;
}
您会遇到什么错误?您是否在调试器中运行过它?它是返回的错误、异常还是分段错误?工作的代码版本与您现在的版本有什么不同?请编辑您的帖子并包含一些相关信息,而不是仅仅转储代码并说它不工作。我编辑它并添加我的错误我假设你没有调试它,否则你会注意到你在一个空图像上调用findContours
,因为frame
直到while循环才初始化。谢谢你,miki现在完成了它的工作