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; }