Я пытаюсь сделать простую программу, которая будет вычитать объект из фона с помощью 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. Несмотря на то, что могут быть некоторые встроенные функции для выполнения работы, я бы предпочел сам сделать алгоритм.
Есть несколько вещей, которые вы можете попробовать изменить, чтобы идентифицировать свою проблему.
Но я думаю, что одно из изображений, которые вы передаете в функцию вычитания, недопустимо. Пожалуйста, убедитесь, что оба они действительны, прежде чем обрабатывать их
И, наконец, вы должны попытаться отладить вашу программу, чтобы определить точное место в вашем коде, где выдается исключение.
Других решений пока нет …