OpenCV USBカメラをキャプチャして動画を作成する(C++)

C++でUSBカラメをキャプチャしてAVIを作成する。
OpenCV 3.4.1

#include <opencv2/opencv.hpp>

int main()
{
    using std::cout;
    using std::endl;

    int camera_id = 0;
    double fps = 30.0;
    double width = 640.0;
    double height = 480.0;

    // DirectShowでキャプチャ
    cv::VideoCapture cap(cv::CAP_DSHOW + camera_id);

    if (!cap.isOpened()) {
        cout << "camera open error" << endl;
        return;
    }

    if (!cap.set(cv::CAP_PROP_FPS, fps)) cout << "camera set fps error" << endl;
    if (!cap.set(cv::CAP_PROP_FRAME_WIDTH, width)) cout << "camera set width error" << endl;
    if (!cap.set(cv::CAP_PROP_FRAME_HEIGHT, height)) cout << "camera set height error" << endl;

    // モーションJPEGで保存する
    int fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
    bool isColor = true;

    cv::VideoWriter writer("test.avi", fourcc, fps, cv::Size(width, height), isColor);
    cv::namedWindow("framewin", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
    cv::Mat frame;

    std::vector<uchar> jpeg_buff;
    std::vector<int> param(2);
    param[0] = CV_IMWRITE_JPEG_QUALITY;
    param[1] = 95;

    while (true) {
        // 1フレームキャプチャする
        cap >> frame;
        if (frame.empty()) break;

        // 水平反転
        cv::flip(frame, frame, 1);

        // JPEG変換
        // libjpeg-turboを使っているので(不要?)
        cv::imencode(".jpg", frame, jpeg_buff, param);
        cv::Mat jpeg_image = cv::imdecode(cv::Mat(jpeg_buff), CV_LOAD_IMAGE_COLOR);

        // AVIに書き込み
        writer << jpeg_image;

        cv::imshow("framewin", jpeg_image);

        if (cv::waitKey(1) >= 0) break;
    }

    cap.release();
    writer.release();

    cv::destroyAllWindows();

    return 0;
}