Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 如何在视频中跟踪前景并在其上绘制矩形_C++_Opencv_Object Detection_Opencv3.0 - Fatal编程技术网

C++ 如何在视频中跟踪前景并在其上绘制矩形

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

我正在做一个跟踪人的动作检测脚本。 我使用了前景函数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 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现在完成了它的工作