Вычитание фона

Я пытаюсь вычесть с помощью bitwise_and и BackgroundSubtractor, но у меня такая ошибка:

Ошибка OpenCV: утверждение не удалось ((mtype == CV_8U || mtype == CV_8S) && _mask.sameSize (* psrc1)) в cv :: binary_op, файл C: \ build \ master_winpack-build-win64-vc14 \ opencv \ modules \ core \ src \ arithm.cpp, строка 241

код:

Mat frame1;
Mat frame_mask;

bool bSuccess = cap.read(frame1); 

if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stream" << endl;
break;
}
pMOG2->apply(frame1, frame_mask);
Mat kernel = Mat::ones(frame1.size(), CV_8UC1);
erode(frame1, frame_mask, kernel);
bitwise_and(frame1, frame1, frame, frame_mask);

Ошибка возникает, когда я использую bitwise_and (...) после размытия. По отдельности работают нормально.

Я использовал OpenCV 3.2.0 и VS15. Я новичок в OpenCV, не могли бы вы сказать, что я делаю не так? Спасибо.


person kuppy28    schedule 22.05.2017    source источник
comment
Из-за ошибки может показаться, что ваш источник и маска имеют разные размеры или маска не 8-битная.   -  person Khouri Giordano    schedule 22.05.2017
comment
Непонятно, что вы пытаетесь сделать, хотите ли вы оставить только движущиеся объекты, как в этом изображение?   -  person Elouarn Laine    schedule 22.05.2017
comment
@ElouarnLaine да, я пытаюсь сделать что-то подобное   -  person kuppy28    schedule 22.05.2017
comment
@KhouriGiordano у них одинаковый размер - 640x480, и в моем коде я сделал что-то вроде этого: Mat frame_mask (frame.size (), CV_8UC1); но у меня все еще есть эта ошибка :(   -  person kuppy28    schedule 22.05.2017


Ответы (1)


Ошибка возникает, потому что ваш frame_mask не относится к типу CV_8U или CV_8S.

Действительно, с этой строкой: erode(frame1, frame_mask, kernel)

frame_mask преобразуется в CV_8UC3 Mat, поскольку вход Mat (frame1) имеет тип CV_8UC3.


В любом случае, я не совсем понимаю, что вы пытаетесь сделать с операцией bitwise_and, поэтому я сделал минимальный пример, чтобы показать правильный способ делать то, что вы хотите:

int main(int argc, char** argv)
{
    Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();

    VideoCapture cap = VideoCapture(0);
    Mat frame1, frame_mask;

    while (cap.isOpened())
    {
        cap.read(frame1);
        pMOG2->apply(frame1, frame_mask);

        Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); // erode filter's kernel
        erode(frame_mask, frame_mask, kernel);

        Mat movingAreas;
        frame1.copyTo(movingAreas, frame_mask);

        imshow("movingParts", movingAreas);

        keyCode = waitKey(1);
        if (keyCode == 27 || keyCode == 'q' || keyCode == 'Q')
            break;
    }

    return 0;
}

И вот результат:  введите описание изображения здесь

Надеюсь, это поможет!

person Elouarn Laine    schedule 22.05.2017
comment
@ kuppy28 np, подумайте о том, чтобы принять ответ, если он вам помог;) - person Elouarn Laine; 24.05.2017
comment
извините, но у меня есть еще один вопрос. Я хочу добиться эффекта, как на этом видео (слева нижний угол). Что я должен делать? - person kuppy28; 01.06.2017
comment
@ kuppy28 Я не вижу никаких эффектов в нижнем левом окне (озаглавленном mask). Вы можете еще объяснить? - person Elouarn Laine; 01.06.2017
comment
хорошо, фон в этом видео постоянно черный, и мы видим только руку, не так ли? После запуска кода я получил этот эффект - person kuppy28; 01.06.2017
comment
@ kuppy28, я немного запуталась. Желаемый эффект - это именно то, что я объяснил в своем ответе. Вы пробовали скомпилировать мой фрагмент кода? - person Elouarn Laine; 01.06.2017
comment
Я тоже. Да, я пытался скомпилировать ваш код и, к сожалению, эффект тот же :( - person kuppy28; 01.06.2017
comment
Хм, на самом деле ваш результат кажется правильным, кроме того факта, что цвет не тот. Какой камерой ты пользуешься? Кажется, выводит изображения HSV. - person Elouarn Laine; 01.06.2017
comment
да, конвертирую в hsv. Но когда я не двигаю рукой, она сразу становится черной. Более того, какая-то часть ладони остается черной, это нормально? - person kuppy28; 01.06.2017
comment
Оба наблюдения нормальны. Статистическая модель фона вашего BackgroundSubtractor обновляется в каждом кадре. Поэтому, если вы показываете статичную руку, через некоторое время она будет считаться фоном. какая-то часть ладони остается черной, вероятно, это связано с объяснением выше. Чтобы исправить первое, вам нужно использовать BackgroundSubtractor со статистической моделью статического фона (которую вы бы тренировали только один раз с изображением вашего фона). Надеюсь, это имеет смысл :) - person Elouarn Laine; 01.06.2017