Как получить видеокадры в Qt?
Я новичок в Qt, я знаю только основы: создание интерфейсов и подключение слотов. В нескольких словах мои знания совсем не глубокие.
Мне нужно открыть видеофайл и захватить все его кадры, чтобы получить каналы R, G, B и, позже, обрабатывать оптический поток (это уже сделано) кадр за кадром, чтобы, наконец, представить его в окне.
Можно ли получить кадры видео с помощью Qt? Я много исследовал, но не нашел ничего убедительного.
2 ответа
Я не знаю, почему я не смог включить необходимые заголовки Qt для обработки фреймов (они, казалось, всегда имели неразрешенные зависимости, а некоторые не существовали), поэтому я обратился к OpenCV 3.0 и сделал это следующим образом:
cv::VideoCapture cap(videoFileName);
if(!cap.isOpened()) // check if we succeeded
return;
while (cap.isOpened())
{
cv::Mat frame;
cap >> frame;
cv::flip(frame, frame, -1);
cv::flip(frame, frame, 1);
// get RGB channels
w = frame.cols;
h = frame.rows;
int size = w * h * sizeof(unsigned char);
unsigned char * r = (unsigned char*) malloc(size);
unsigned char * g = (unsigned char*) malloc(size);
unsigned char * b = (unsigned char*) malloc(size);
for(int y = 0; y < h;y++)
{
for(int x = 0; x < w; x++)
{
// get pixel
cv::Vec3b color = frame.at<cv::Vec3b>(cv::Point(x,y));
r[y * w + x] = color[2];
g[y * w + x] = color[1];
b[y * w + x] = color[0];
}
}
}
cap.release();
Это отлично сработало для моей цели, поэтому я не продолжал исследования.
Спасибо, в любом случае.
Вы можете использовать QMediaPlayer для достижения этой цели.
- Создайте экземпляр QMediaPlayer.
- Подкласс QAbstractVideoSurface.
- Установите вашу реализацию в качестве выхода для медиаплеера через
QMediaPlayer::setVideoOutput
, - Накормите медиаплеер нужным файлом, и в конце концов он начнет звонить
QAbstractVideoSurface::present(const QVideoFrame & frame)
на вашей реализацииQAbstractVideoSurface
если видео было успешно загружено. Затем вы можете получить доступ к каналам и всему из QVideoFrame и нарисовать рамку на виджете.