Help us understand the problem. What is going on with this article?

OpenCVによるUSBカメラ画像の取得

More than 1 year has passed since last update.

OpenCVによるUSBカメラ画像の取得

OpenCVでは,cv::VideoCaptureで,USB接続したカメラから簡単に画像を取得することができる.

以下では,公式サンプルを一部改変したコードで説明していく.

基本的な手順は
1. カメラデバイスのオープン.
2. カメラ画像の取得と画面への描画.
3. デバイスの解放.

#include "opencv2/opencv.hpp"

int main(int argh, char* argv[])
{
    cv::VideoCapture cap(0);//デバイスのオープン
    //cap.open(0);//こっちでも良い.

    if(!cap.isOpened())//カメラデバイスが正常にオープンしたか確認.
    {
        //読み込みに失敗したときの処理
        return -1;
    }

    cv::Mat frame; //取得したフレーム
    while(cap.read(frame))//無限ループ
    {
        //
        //取得したフレーム画像に対して,クレースケール変換や2値化などの処理を書き込む.
        //

        cv::imshow("win", frame);//画像を表示.
        const int key = cv::waitKey(1);
        if(key == 'q'/*113*/)//qボタンが押されたとき
        {
            break;//whileループから抜ける.
        }
        else if(key == 's'/*115*/)//sが押されたとき
        {
            //フレーム画像を保存する.
            cv::imwrite("img.png", frame);
        }
    }
    cv::destroyAllWindows();
    return 0;
}

USBカメラのオープン

  • cv::VideoCaptureを用いて,USBカメラにアクセスを行う.
  • cv::VideoCapture::open()の引数によって,開くカメラデバイスを選択する.
    • 筆者の環境(Macbook Air)では,内蔵インカメラが0で,USBで接続したカメラに1以降が割り当てられている.
  • USBカメラが正常にオープン出来たかはisOpen()を呼ぶことで確認できる.
cv::VideoCapture cap(0);//デバイスのオープン
//cap.open(0);//こっちでも良い.

if(!cap.isOpened())//カメラデバイスが正常にオープンしたか確認.
{
    //読み込みに失敗したときの処理
    return -1;
}

USBカメラ画像の表示

  • カメラ画像を連続して取得する場合などは,while文やfor文などのループ中に,画像の取得や描画処理を書き,cv::imshow()で表示する.
  • ある条件を満たしたらbreakを呼ぶようにすることでループから抜けて処理を終了する.
    • 以下のサンプルでは,cv::waitKey()で取得したキー入力を終了のための条件としている.

while文の中で行っている手順は以下の通り.

  • cv::VideoCapture::read()で現在のフレームをcv::Matに取得する.
    • cv::VideoCapture::read()はフレーム取得に成功すると,true,失敗するとfalseを返すので,
    • 以下の例では,これをwhile文の継続条件としている.
  • 取得した画像をcv::imshow()でウィンドウに描画する.
  • cv::waitKey()でキー入力を受ける.
    • 引数は待ち時間(ms).
    • 戻り値は押されたキーのアスキーコード.
  • 取得したキーで終了や保存処理を行う.
cv::Mat frame; //取得したフレーム
while(cap.read(frame))//無限ループ
{
    //
    //取得したフレーム画像に対して,クレースケール変換や2値化などの処理を書き込む.
    //

    cv::imshow("win", frame);//画像を表示.
    const int key = cv::waitKey(1);
    if(key == 'q'/*113*/)//qボタンが押されたとき
    {
        break;//whileループから抜ける.
    }
    else if(key == 's'/*115*/)//sが押されたとき
    {
       //フレーム画像を保存する.
       cv::imwrite("img.png", frame);
    }
}
cv::destroyAllWindows();// ウィンドウを閉じる.

return 0;

デバイスの解放

  • cv::VideoCaptureのデストラクタが正常に呼ばれると自動的にデバイスは解放される.
  • cv::VideoCapture::release()を呼ぶと明示的に解放することができる.
vs4sh
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした