OpenCV 4.0 не может сохранить видео - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь записать экран своего рабочего стола и сохранить его в видео с помощью opencv videoWriter, но всегда получаю видео размером 6 КБ, которое даже не воспроизводится.

Вот мой код для того же, яm сначала создайте объект mat для экрана, а затем запишите его в файл.

#include "pch.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream>
#include <stdio.h>
#include <opencv2/objdetect/objdetect.hpp>
#include <Windows.h>

using namespace std;
using namespace cv;


int height;
int width;

Mat hwnd2mat()
{
  // returning Mat object for screen and working fine as I'm showing it into a window
}


void CaptureScreen()
{
    int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    HWND hDesktopWnd = GetDesktopWindow();
    int key = 0;
    string filename = "D:/outcpp.avi";
    cv::Size targetSize = cv::Size(320, 240);
    VideoWriter video(filename, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, targetSize);
    while (1)
    {
        Mat frame = hwnd2mat();

        cv::Mat image = frame;
        cv::Mat dst;
        cv::resize(image, dst, targetSize);

        if (dst.empty())
            break;
        video.write(dst);
        imshow("Frame", dst);
        char c = (char)waitKey(1);
        if (c == 27)
            break;
    }
    video.release();
    destroyAllWindows();
    //readVideo(filename);
}




int main(int argc, char **argv)
{
    CaptureScreen();
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Попробуйте другой код fourcc с * .mp4, который лучше в любом случае, и запустите, не показывая изображение.Убедитесь, что видео открыто и успешно выпущено.

void hwnd2mat(cv::Mat &mat)
{
    int w = mat.cols;
    int h = mat.rows;

    auto hdc = GetDC(0);
    auto memdc = CreateCompatibleDC(hdc);
    auto hbitmap = CreateCompatibleBitmap(hdc, w, h);
    auto holdbmp = SelectObject(memdc, hbitmap);
    BitBlt(memdc, 0, 0, w, h, hdc, 0, 0, SRCCOPY);

    BITMAPINFOHEADER bi = { sizeof(bi), w, -h, 1, 24 };
    GetDIBits(hdc, hbitmap, 0, h, mat.data, (BITMAPINFO*)&bi, 0);

    SelectObject(memdc, holdbmp);
    DeleteDC(memdc);
    DeleteObject(hbitmap);
    ReleaseDC(0, hdc);
}

int main()
{
    int w = GetSystemMetrics(SM_CXSCREEN);
    int h = GetSystemMetrics(SM_CYSCREEN);
    cv::Size size = cv::Size(w, h);
    Mat frame(size, CV_8UC3);

    double fps = 10.0;

    //string filename = "d:\\outcpp.avi";
    //auto fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');

    string filename = "d:\\outcpp.mp4";
    auto fourcc = cv::VideoWriter::fourcc('m', 'p', '4', 'v');

    VideoWriter video(filename, fourcc, fps, frame.size());
    if(!video.isOpened())
    {
        cout << "codec failed\n";
        return 0;
    }

    while(GetAsyncKeyState(VK_ESCAPE) == 0)
    {
        cout << ".";
        hwnd2mat(frame);
        video.write(frame);
        Sleep(int(1000.0/fps));
    }

    video.release();
    cout << "\nreleased\n";

    return 0;
}
0 голосов
/ 31 декабря 2018

Вы вызываете функцию, которая в соответствии с ее сигнатурой возвращает что-то, но на самом деле это не так.Это вызывает неопределенное поведение в соответствии со стандартом C ++, поэтому ваша программа содержит ошибки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...