OpenCV C ++ видео захват изображения вычитание фона

Я пытаюсь сделать простую программу, которая будет вычитать объект из фона с помощью OpenCV и C ++.

Идея состоит в том, чтобы использовать VideoCapture для:

  • Захват статического фона (без объекта)
  • Затем непрерывно захватывайте текущий кадр и вычитайте его из фона

Однако при отправке захваченных данных в мою функцию BackgroundSubtraction () возникла проблема. Это дает мне ошибку:

Необработанное исключение в 0x77d815 в OpenCV_BackgroundSubtraction.exe:
0xC000005: допускает нарушение в отношении местоположения 0x04e30050

Однако иногда кажется, что это работает, а иногда нет (с использованием Visual Studio 2010 C ++ в Windows 7 64-разрядной версии).

У меня такое ощущение, что это как-то связано с распределением памяти и приоритетом функций. Похоже, что захватчик VideoCapture, возможно, недостаточно быстр, чтобы захватить / записать кадры, прежде чем я отправлю его в BackgroundSubtraction ().

Встроенная веб-камера в моем ноутбуке работает нормально (то есть показывает изображение), но что-то в моем коде неверно. Я пытался поиграть с некоторыми задержками, но, похоже, это не повлияло.

Вот мой код:

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;
}

Заранее спасибо!

Ps. Несмотря на то, что могут быть некоторые встроенные функции для выполнения работы, я бы предпочел сам сделать алгоритм.

0

Решение

Есть несколько вещей, которые вы можете попробовать изменить, чтобы идентифицировать свою проблему.
Но я думаю, что одно из изображений, которые вы передаете в функцию вычитания, недопустимо. Пожалуйста, убедитесь, что оба они действительны, прежде чем обрабатывать их

  1. Вы должны убедиться, что ваши снимки созданы и выпущены правильно. Я не могу вспомнить, занят или нет ожидание capture.release (), но я бы проверил, работает ли захват. На самом деле, я бы, вероятно, использовал только один снимок, поскольку вы используете только одну камеру.
  2. Вы не проверяете, что ваш currentImage действительно создан и, следовательно, действителен.
  3. Также я помню, что некоторое время назад было невозможно изменить изображение, созданное объектом захвата, но нужно было сделать копию кадра перед его обработкой. Вы также можете попробовать это
  4. Кроме того, я отметил, что вы передаете одно и то же изображение как для переднего, так и для фонового изображения. Это не проблема сама по себе, но, вероятно, не то, что вы хотите сделать.

И, наконец, вы должны попытаться отладить вашу программу, чтобы определить точное место в вашем коде, где выдается исключение.

1

Другие решения

Других решений пока нет …