OpenCV を用いた USB カメラの画像表示

概要

OpenCV を用いて、USB カメラの映像をそのまま表示するプログラムと、グレースケール化して表示するプログラムの例を示す。コードは C++ で記述し、現在広く使われている OpenCV 4 系の C++ API(cv::VideoCapture などを用いる API)に基づく。

目次

関連する外部ページ

サイト内の関連情報

USB カメラの映像をそのまま表示する

USB カメラから映像を取り込み、ウィンドウにそのまま表示する C++ プログラムの例を示す。ESC キーを押すと終了する。

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char **argv)
{
  const double WIDTH = 640;  // 幅
  const double HEIGHT = 480; // 高さ
  const int CAMERANUM = 0; // カメラ番号

  // カメラ接続、幅と高さの設定
  VideoCapture capture(CAMERANUM);
  capture.set(CAP_PROP_FRAME_WIDTH, WIDTH);
  capture.set(CAP_PROP_FRAME_HEIGHT, HEIGHT);

  Mat frame;

  namedWindow("Capture", WINDOW_AUTOSIZE);

  while (1) {
    capture.read(frame);
    imshow("Capture", frame);
    if (waitKey(1) == 27) { // 27 は ESC キーのコード
      break;
    }
  }

  capture.release();
  destroyWindow("Capture");

  return 0;
}

元画像とグレースケール化した画像を並べて表示する

USB カメラの映像(元画像)と、それをグレースケール化した画像を、別々のウィンドウに並べて表示する C++ プログラムの例を示す。ESC キーを押すと終了する。

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char **argv)
{
  const double WIDTH = 640;  // 幅
  const double HEIGHT = 480; // 高さ
  const int CAMERANUM = 0; // カメラ番号

  // カメラ接続、幅と高さの設定
  VideoCapture capture(CAMERANUM);
  capture.set(CAP_PROP_FRAME_WIDTH, WIDTH);
  capture.set(CAP_PROP_FRAME_HEIGHT, HEIGHT);

  Mat frame;
  Mat gray;

  namedWindow("Capture", WINDOW_AUTOSIZE);
  namedWindow("GrayScale", WINDOW_AUTOSIZE);

  while (1) {
    capture.read(frame);
    imshow("Capture", frame);
    cvtColor(frame, gray, COLOR_BGR2GRAY);
    imshow("GrayScale", gray);
    if (waitKey(1) == 27) { // 27 は ESC キーのコード
      break;
    }
  }

  capture.release();
  destroyWindow("Capture");
  destroyWindow("GrayScale");

  return 0;
}

Linux でのビルド手順例

Linux 上で、ソースファイル hoge.cc をコンパイルして実行ファイル a.out を作る例を示す。OpenCV 4 系では、コンパイルに必要なヘッダとライブラリの指定を pkg-config(インストール済みライブラリのコンパイル設定を取得するツール)で得て、g++ に渡す。

g++ -o a.out hoge.cc $(pkg-config --cflags --libs opencv4)