Почему функция cv :: subtract () возвращает ошибку «размер входных аргументов не совпадает»?

Я хочу вычесть два последовательных изображения, снятые с веб-камеры.
как вы можете видеть, я делаю это внутри цикла while. В последней строке цикла while я устанавливаю frame2 = frame и поэтому я могу вычесть их из следующей итерации. Но функция cv :: subtract возвращает вышеуказанную ошибку в терминале.

Что я делаю неправильно?

#include <iostream>
#include "core.hpp"#include "highgui.hpp"#include "imgcodecs.hpp"#include "cv.h"
using namespace std;
using namespace cv;int main(int argc, char* argv[])
{

VideoCapture cap(0); ///open the video camera no. 0 (laptop's default camera)

///make a writer object:
cv::VideoWriter writer;

if (!cap.isOpened())  /// if not success, exit program
{
cout << "ERROR INITIALIZING VIDEO CAPTURE" << endl;
return -1;
}

char* windowName = "Webcam Feed(diff image)";
namedWindow(windowName,WINDOW_NORMAL); ///create a window to display our webcam feed///we need to define 4 arguments for initializing the writer object:
//filename string:
string filename = "C:\\Users\\PEYMAN\\Desktop\\ForegroundExtraction\\openCV_tutorial\\2.writing from video to file\\Payman.avi";

//fourcc integer:
int fcc = CV_FOURCC('D','I','V','3');

//frame per sec integer:
int fps = 10;

//frame size:
cv::Size framesize(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));///initialize the writet object:
writer = VideoWriter(filename,fcc,fps,framesize);

if(!writer.isOpened()){

cout << "Error opening the file" << endl;
getchar();
return -1;
}

int counter = 0;
while (1) {

Mat frame,frame2,diff_frame;///read a new frame from camera feed and save it to the variable frame:
bool bSuccess = cap.read(frame);if (!bSuccess) ///test if frame successfully read
{
cout << "ERROR READING FRAME FROM CAMERA FEED" << endl;
break;
}

/// now the last read frame is stored in the variable frame and here it is written to the file:
writer.write(frame);

if (counter > 0){

cv::subtract(frame2,frame,diff_frame);
imshow(windowName, diff_frame ); ///show the frame in "MyVideo" window

}

///wait for 10ms for a key to be pressed
switch(waitKey(1)){

///the writing from webcam feed will go on until the user presses "esc":
case 27:
///'esc' has been pressed (ASCII value for 'esc' is 27)
///exit program.
return 0;

}

frame2 = frame;
counter++;
}

return 0;

}

1

Решение

Каждый раз, когда вы выполняете цикл while frame2 создан и инициализирован по умолчанию. Когда вы звоните

cv::subtract(frame2,frame,diff_frame);

Вы пытаетесь вычесть построенный по умолчанию Mat из Mat это имеет изображение в нем. Эти двое Mats не будет одинакового размера, поэтому вы получите ошибку.

Вам необходимо переместить декларацию frame а также frame2 за пределами цикла while, если вы хотите, чтобы они сохраняли свои значения после каждого выполнения цикла while. Вам также нужно инициализировать frame2 к тому же размеру или захватить в него второе изображение, чтобы вы могли использовать subtract первый раз до конца.

2

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

Вы должны объявить frame2 выходит за рамки while петля, как вы сделали с counter, Прямо сейчас вы получаете свежий, пустой frame2 с каждой итерацией цикла.

Вы могли бы также переместить все Matвне while Цикл, так что память не должна быть выделена в конце каждой итерации и перераспределена на следующей, хотя это не ошибка, и вы, скорее всего, не увидите снижение производительности в этом случае

Кроме того, @rhcpfan прав в том, что вам нужно быть осторожным с мелкими и глубокими копиями. использование cv::swap(frame, fram2),

2

По вопросам рекламы [email protected]