前回のつづき.
今回は基本的な画像処理をまとめてメモ.
#画像の読み込み, 書き込み, 表示
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;
}
}
とりあえずはここまで.
オブジェクト指向で書いてみたいと思う今日この頃.