Пустые кадры при явном копировании значений пикселей в OpenCV

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

Как ни странно, выходные кадры полностью черные, когда пиксели установлены индивидуально, но являются написано правильно, когда весь кадр клонирован.

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

Кто-нибудь знает, где я иду не так?

test.cpp:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;

#define RGB_REF(PR,NC,R,C,CH) (*((PR) + ((3*(NC)*(R)+(C))+(CH))))
#define GRAY_REF(PR,NC,R,C) (*((PR) + (NC)*(R)+(C)))

int main(int argc, char* argv[])
{
string video_path(argv[1]);
cerr << "Video path is " + video_path + "\n";
VideoCapture capture(video_path);
if ( !capture.isOpened() )
{
cerr << "Input file could not be opened\n";
return 1;
} else
{
string output_path(argv[2]);
VideoWriter output;
int ex = (int)capture.get(CV_CAP_PROP_FOURCC);
Size S = Size((int) capture.get(CV_CAP_PROP_FRAME_WIDTH),
(int) capture.get(CV_CAP_PROP_FRAME_HEIGHT));
output.open(output_path,ex,capture.get(CV_CAP_PROP_FPS),S,true);
if ( !output.isOpened() )
{
cerr << "Output file could not be opened\n";
return 1;
}
unsigned int numFrames = (unsigned int) capture.get(CV_CAP_PROP_FRAME_COUNT);
unsigned int m = (unsigned int) capture.get(CV_CAP_PROP_FRAME_HEIGHT);
unsigned int n = (unsigned int) capture.get(CV_CAP_PROP_FRAME_WIDTH);
unsigned char* im = (unsigned char*) malloc(m*n*3*sizeof(unsigned char));
unsigned char* bw = (unsigned char*) malloc(m*n*3*sizeof(unsigned char));
Mat frame(m,n,CV_8UC3,im);
Mat outputFrame(m,n,CV_8UC3,bw);
for (size_t i=0; i<numFrames; i++)
{
capture >> frame;
for (size_t x=0;x<(3*m*n);x++)
{
bw[x] = im[x];
}
output << outputFrame; // blank frames
//            output << frame;  // works
//            output << (outputFrame = frame); // works
}
}
}

0

Решение

Когда вы запрашиваете кадр из VideoCapture как capture >> frame;, frame модифицируется. Скажем, у него есть новый буфер данных. Так im больше не указывает на буфер frame,
Пытаться
bm[x] = frame.ptr()[x];

1

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

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

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