Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
OpenCV C++;视频捕获图像背景减法 我试图用OpenCV和C++来做一个简单的程序,从背景中减去一个对象。_C++_Image Processing_Opencv_Background Subtraction - Fatal编程技术网

OpenCV C++;视频捕获图像背景减法 我试图用OpenCV和C++来做一个简单的程序,从背景中减去一个对象。

OpenCV C++;视频捕获图像背景减法 我试图用OpenCV和C++来做一个简单的程序,从背景中减去一个对象。,c++,image-processing,opencv,background-subtraction,C++,Image Processing,Opencv,Background Subtraction,我们的想法是使用视频捕获来: 捕获静态背景(无对象) 然后连续捕获当前帧并从背景中减去该帧 但是,我在将捕获的数据发送到Background减法()函数时遇到了一个问题。这给了我一个错误: OpenCV_background减法.exe中0x77d815处未处理的异常: 0xC000005:关于位置0x04e30050的访问冲突 但是,有时它看起来是有效的,其他时候不(使用Visual Studio 2010 C++在Windows 7上添加64位)。 我觉得这与内存分配和函数的优先级有关。

我们的想法是使用视频捕获来:

  • 捕获静态背景(无对象)
  • 然后连续捕获当前帧并从背景中减去该帧
但是,我在将捕获的数据发送到Background减法()函数时遇到了一个问题。这给了我一个错误:

OpenCV_background减法.exe中0x77d815处未处理的异常: 0xC000005:关于位置0x04e30050的访问冲突

但是,有时它看起来是有效的,其他时候不(使用Visual Studio 2010 C++在Windows 7上添加64位)。 我觉得这与内存分配和函数的优先级有关。似乎视频捕获抓取器可能不够快,在我将其发送到Background减法()之前抓取/写入帧

我笔记本电脑中的内置网络摄像头工作正常(即显示图片),但我的代码中有些地方出错。我试着处理一些延迟,但似乎没有影响

这是我的密码:

Mat BackgroundSubtraction(Mat background, Mat current);

int main()
{
Mat colorImage;
Mat gray;

// Background subtraction
Mat backgroundImage;
Mat currentImage;
Mat object; // the object to track

VideoCapture capture, capture2;

capture2.open(0);

// Initial frame
while (backgroundImage.empty())
{
    capture2 >> backgroundImage;
    cv::imshow("Background", backgroundImage);
    waitKey(100);
    capture2.release();

}

capture.open(0);

// Tracking the object
while (true)
{
    capture >> currentImage;

    if ((char)waitKey(300) == 'q') // Small delay
        break;

            // The problem happens when calling BackgroundSubtraction()
    object = BackgroundSubtraction(backgroundImage, backgroundImage);
    cv::imshow("Current frame", currentImage);
    cv::imshow("Object", object);
}

Mat BackgroundSubtraction(Mat background, Mat current)
{

    // Convert to black and white
Mat background_bw;
Mat current_bw;
cvtColor(background, background_bw, CV_RGB2GRAY);
cvtColor(current, current_bw, CV_RGB2GRAY);

Mat newObject(background_bw.rows, background_bw.cols, CV_8UC1);

for (int y = 0; y < newObject.rows; y++)
{
    for (int x = 0; x < newObject.cols; x++)
    {
                    // Subtract the two images
                    newObject.at<uchar>(y, x) = background_bw.at<uchar>(y, x)
            - current_bw.at<uchar>(y, x);
    }
}

return newObject;
}
Mat background减法(Mat background,Mat current);
int main()
{
彩色图像;
席灰色;
//背景减法
背景图像;
Mat图像;
Mat object;//要跟踪的对象
视频捕获,捕获2;
capture2.打开(0);
//初始帧
while(backgroundImage.empty())
{
capture2>>背景图片;
简历::imshow(“背景”,背景图片);
等待键(100);
capture2.释放();
}
capture.open(0);
//跟踪目标
while(true)
{
捕获>>当前图像;
if((char)waitKey(300)='q')//小延迟
打破
//调用background减法()时会出现问题
对象=背景减法(背景图像,背景图像);
cv::imshow(“当前帧”,currentImage);
cv::imshow(“对象”,对象);
}
Mat背景减法(Mat背景,Mat当前)
{
//转换成黑白
Mat-background_-bw;
Mat-current_-bw;
CVT颜色(背景色、背景色、背景色);
CVT颜色(当前、当前、当前颜色);
Mat newObject(background_bw.rows、background_bw.cols、CV_8UC1);
对于(int y=0;y
提前谢谢


注:尽管可能有一些内置函数来完成这项工作,但我宁愿自己制作算法。

有几件事你可以尝试改变,以确定你的问题。 但是我猜你传递给减法器函数的其中一个图像是无效的。在处理它们之前,请确认这两个图像实际上都是有效的

  • 您应该确保您的捕获已正确创建和发布。我记不起捕获.release()是否正忙着等待,但我会验证捕获是否正常工作。实际上,我可能只使用一个捕获,因为您只使用一个摄像头
  • 您没有验证您的当前映像是否已实际创建,因此无效
  • 我还记得不久前,不可能修改由捕获对象创建的图像,但必须在处理它之前复制一个帧。您也可以尝试一下
  • 此外,我注意到,您正在为前景和背景图像传递相同的图像。这本身不是问题,但可能不是您想要做的

  • 最后,您应该试着调试程序,以确定代码中引发异常的确切位置。

    在哪一行出现错误?谢谢,我会查看一下!大约4:这只是为了调试目的。之前我传递了背景和当前图像。哦,我想我解决了它。显然,背景我没有正确保存mage(我通过imwrite()进行验证)。似乎capture.release()函数的作用与我想象的不同。现在我根本不使用它,而是将背景图像保存在本地,然后重新使用save VideoCapture。