LoginSignup
7
7

More than 5 years have passed since last update.

OpenCVで基本的な画像処理

Posted at

前回のつづき.
今回は基本的な画像処理をまとめてメモ.

画像の読み込み, 書き込み, 表示

    cv::Mat img;
    //画像の読み込み第2引数が1であればカラー, 0であればグレースケール
    img = cv::imread("./sample.jpg", 1);
    //画像の書き込み
    cv::imwrite("filename.jpg", img);
    //画像の表示, cv::waitKey(0)などで,入力待ち状態にする必要がある
    cv::imshow("Window name", img);

カラー画像のグレースケール化

カラー画像をグレースケールで読み込み

    cv::Mat img;
    img = cv::imread("sample.jpg", 0);

カラー画像をグレースケールに変換

    cv::Mat img = cv::imread("sample.jpg", 1);
    cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);

トリミング

    cv::Mat img;
    img = cv::imread("./sample.jpg", 1);
    //x, y(第1, 2引数)から幅, 高さ(第3, 4引数)で切り取る
    cv::Mat img_out(img, cv::Rect(100, 100, 100, 100));

直線を引く

    //縦横500ピクセルの真っ暗な画像を生成.第3引数で濃淡画像, カラー画像などを指定.
    //CV_8UC3は8bitRGBをあらわす
    cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);
    //生成した画像の(0, 0)から(500, 500)まで青い線を引く.第5引数で線の太さを指定.
    //Scalar()で色の指定. Blur, Green, Redの順番で色を0 ~ 255で調節できる.
    cv::line(img, cv::Point(0, 0), cv::Point(500, 500), cv::Scalar(0, 0, 255), 5);

セグメンテーション

    //2値化するときはグレースケールで読み込む必要がある
    cv::Mat img = cv::imread("sample.jpg", 0);
    //第3, 4引数で閾値を0 ~ 255で指定. CV_THRESH_OTSUを使うことで特に指定する必要がなくなる.
    //THRESH_BINARY_INVで白黒反転
    cv::threshold(img ,img, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
    //画像をぼかす
    cv::blur(img, img, cv::Size(3, 3));

射影変換

    cv::Mat img = cv::imread("sample.jpg", 1);
    //画像サイズを縦640横480ピクセルに変更
    cv::resize(img, img, cv::Size(640, 480), 1);
    //読み込んだ画像の四角形の頂点
    cv::Point2f pts1[] = { cv::Point2f(160, 479), cv::Point2f(480,479), cv::Point2f(480, 240), cv::Point2f(160, 240) };
    //出力画像に対応する四角形の頂点
    cv::Point2f pts2[] = { cv::Point2f(160, 479), cv::Point2f(480, 479), cv::Point2f(400, 240), cv::Point2f(240, 240) };
    //射影変形行列を代入
    cv::Mat pmat = cv::getPerspectiveTransform(pts1, pts2);
    //射影変換第3引数は変換行列
    cv::warpPerspective(img, img, pmat, img.size(), cv::INTER_LINEAR);

カメラの使用

画像の撮影

    cv::Mat img;
    //初期化
    cv::VideoCapture cap(0);
    if(!cap.isOpened()){
        std::cout << "カメラが見つかりません." << std::endl;
    }

    //カメラを読み込む
    while(cap.read(img)){
        cv::imshow("camera", img);      
        int key = cv::waitKey(0);
        //sを押すと撮影, qを押すと終了
        if(key == 's'){
            cv::imwrite("camera.jpg", img);
        }else if(key == 'q'){
            break;
        }
    }

動画

    cv::Mat img;
    //初期化
    cv::VideoCapture cap(0);
    if(!cap.isOpened()){
        std::cout << "カメラが見つかりません." << std::endl;
    }

    //カメラを読み込む
    while(cap.read(img)){
        cv::imshow("Video", img);   
        //qで終了
        if(cv::waitKey(1)=='q'){
            break;      
        }
    }

とりあえずはここまで.
オブジェクト指向で書いてみたいと思う今日この頃.

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7