[w 5 d 2]OpenCV画像処理


(Ubuntu 18.04.6 LTS)
2022.03.15
C++、VSコードを使用
プログラマ自主走行コース

ビデオファイルの読み込みと出力(フルコード)


基本構造は暗記が必要です!
#include <iostream>
#include "opencv2/opencv.hpp"

int main()
{
    cv::Mat img = cv::imread("./resources/lenna.bmp",cv::IMREAD_COLOR);

    if (img.empty()){
        std::cerr << "Image load failed!" << std::endl;
        return -1;
    }

    cv::namedWindow("image");
    cv::imshow("image",img);
    cv::waitKey();
    cv::destroyAllWindows();
    return 0;
}
cv::,std::部分を省略したい場合は、次のコードをmain関数の前に置くことができます.
using namespace std;
using namespace cv;

コード解析

#include <iostream>
#include "opencv2/opencv.hpp"
ヘッダファイルを含めます.OpenCV 2/Opencv.hppを含める必要があります.
int main()
{
    cv::Mat img = cv::imread("./resources/lenna.bmp",cv::IMREAD_COLOR);
cv::Matはマトリックスタイプクラスです.cv::imreadはファイルを読み込む関数です.
Mat cv::imread(const String& filename,int flags= IMREAD_COLOR )
flagに基づいて、どのような形式でロードするかを決定できます.
  • IMREAD UNCHANGED:透明.
  • IMREAD GRAYSCALE:階調画像を読み込みます.
  • IMREAD COLOR:カラー画像を読み込みます.約束を破る.
  • cv::Matimg:Mattype変数imgを作成します.
    「./resources/lenna.bmp」:現在のフォルダのリソースフォルダのlenna.bmpを読み込みます.
    cv::IMREAD COLOR:True Color Image.
        if (img.empty()){
            std::cerr << "Image load failed!" << std::endl;
            return -1;
        }
    エラー検出コード.
    img.空():プライマリタイプ変数imgが空の場合はtrueです.
    imgが空の場合は「Image load failed」を出力し、値-1を返して終了します.
        cv::namedWindow("image");
    空のウィンドウを作成します.ウィンドウ名は「イメージ」
        cv::imshow("image",img);
    void cv::imshow ( const String & winname, InputArray mat )
    「image」という名前のウィンドウにimgオブジェクトを出力します.
        cv::waitKey();
    キーボード入力待ち.上にのみimshowが表示されている場合は、ウィンドウが表示されず、waitKeyで表示できます.数字が含まれている場合は、その期間内にKey入力を待ち、省略または0の場合は待ち続けます.
    ASCIIコードで、ESCが欲しいなら27.
        cv::destroyAllWindows();
    すべてのウィンドウを閉じます.

    主なカテゴリ



    Point-Point(x,y)を使用します.
    Size Size(width,height)形式で使用します.
    Rect-Rect(x、y、width、height).
    String(String)-文字列.OpenCV 4.xバージョンのstd::stringクラスと同じです.
    Verc-同じ複数のデータ・ソースからなるデータ型.
    Scalar:4つの双形を持つ資料型.(4要素ベクトル)

    Mat-マトリクス


    Channel:単一要素の数.
  • 階調は輝度です.true colorは3つのrgbデータ
  • を提供する
    Depth:マトリックス要素で使用されるデータ型情報.
  • 8U: 8 bit, unsigned char
  • 8S: 8 bit, sigend char
  • 32F: 32 bit, float
  • Type:Depth+Channel、典型的な例は以下の通りです.
  • CV_8UC1: 8bit unsigned char, channel 1 == Gray scale image
  • CV_8UC3: 8bit unsigned char, channel 3 == True color image
  • Matオブジェクトの初期化
    cv::Mat img1(height,width,CV_8UC1);
    cv::Mat img2(Size(width,height),CV_8UC3);
    Matオブジェクトを簡単に作成します.
    cv::Mat img3(height,width,CV_8UC1,255);
    cv::Mat img4(height,width,CV_8UC3,Scalar(0,0,255));
    img 3は階調画像を生成し、要素は255(白)
    img 4は真のカラー画像を生成し、OpenCVはBGR順にデータを格納するので、赤色255を用い、残りは0とする.
    cv::Mat img5 = Mat::zeros(3,3,CV_32SC1);
    cv::Mat img6 = Mat::ones(3,3,CV_32FC1);
    img 5は0であり、img 6は1である.
    cv::Mat img1 = cv::imread("lenna.bmp");
    cv::Mat img2 = img1
    
    cv::Mat img3 = img1.clone();
    cv::Mat img4;
    img1.copyTo(img4);
    img 2は浅い放射に似ている.img 1とimg 2は同じオブジェクトを指し、1つを変更すると他のオブジェクトも変更されます.
    img 3,img 4は深放射に類似している.コピーして別のターゲットを作成します.

    ピクセルアクセス

    //at 사용
    cv::Mat img1 = cv::imread("lenna.bmp",cv::IMREAD_GRAYSCALE);
    for (int y=0;y<img1.rows;y++){
    	for (int x=0;x<img1.cols;x++{
        	img1.at<uchar>(y,x)++;
        }
    }
    Matオブジェクト.at単一のピクセルには、(y,x)としてアクセスできます.
    上のコードは輝度が1つ増えるごとにコードです.
    //ptr 사용
    cv::Mat img1= cv::imread("lenna.bmp",cv::IMREAD_GRAYSCALE);
    for (int y=0;y<img1.rows;y++){
    	uchar* p = img1.ptr<uchar>(y);
    	for (int x=0;x<img1.cols;x++{
        	p[x]++;
        }
    }
    * p=Matオブジェクト.ptr(y)はpがy rowであることを示し,値はp[x]として入力できる.0から開始
    行為単位に近い面に有利である.