OpenCV での Mat クラス テンプレートの基盤 (インスタンス)

目次

1. Mat クラス テンプレートに関する知識ポイント

2. cv::Mat クラス オブジェクトを作成する

3. cv::Mat クラスオブジェクトの基本操作

(1) 画像読み込み、画像表示、画像保存


Windows の CodeBlocks は Opencv 環境を構成します

OpenCV データ構造

1. Mat クラス テンプレートに関する知識ポイント

  • Mat クラス テンプレートは、主に画像データの保存に使用される他の n 次元配列を保存するために使用できます. デフォルトでは、cv::Mat クラス オブジェクトを定義するとき、そのサイズは 0 x 0 です (適切なパラメータをコンストラクター) のように:
    • cv:Mat img(240,320,CV_8U,cv::Scalar(100))
    • このうち、CV_8U は画像の各ピクセルが 1 バイト (8 ビット) で表されることを意味し、U は符号なし整数を意味します。
    • カラー画像の場合は、CV_8UC3 の 3 つのチャネル (チャネル) を使用します。
    • 16 ビットまたは 32 ビットの整数 CV_8SC3、32 ビットまたは 64 ビットの浮動小数点 CV_32F も使用できます。
  • cv::Mat クラス オブジェクトがスコープを離れると、自動的に破棄されるため、メモリ リークが回避されます。
  • cv::Mat クラスは、データをコピーする代わりに、ある画像を別の画像にコピーするための参照カウンターと浅いコピー メカニズムを提供します。2 つの画像は、特にパラメータが値と関数によって渡される場合に、同じデータ領域を共有します。画像が返ってきました。
  • 参照カウンターは、すべての参照が破棄されるまで、データが実際に破棄されないようにします。

2. cv::Mat クラス オブジェクトを作成する

cv::Mat クラス オブジェクト
文法 説明
double m[2][2] = { {1.0,2.0},{3.0,4.0}};Mat M(2,2,CV_32F,m) 2 次元配列 m から 2 x 2 次元行列 M を作成します
マット M(100,100,CV_32FC2,スカラー(1,3)) 100 x 100 の 2 チャネル マトリックスを作成し、最初のチャネルを 1 で、2 番目のチャネルを 3 で埋めます。
M.create(300,300,CV_8UC(15)) 15 チャネルの 300 x 300 マトリックスを作成する
int サイズ[3] = {7,8,9};Mat M(3,サイズ,CV_8U,Scalar::all(0)) 次元が 3 の多次元データを作成します。各次元のスケールは、サイズ配列によって指定されます。
Mat M = Mat::eye(7,7,CV_32F) 各要素が 32 ビット float である 7 x 7 単位行列を作成します。
Mat M = Mat:zeros(7,7,CV_64F) ゼロの 7 x 7 行列を作成します。各要素は 64 ビットの浮動小数点数です。
Mat M = Mat:ones(7,7,CV_64F) すべて 1 の 7 x 7 マトリックスを作成します。各要素は 64 ビット浮動小数点数です。

cv::Mat クラス オブジェクトの要素にアクセスする
文法 説明
M.at<double>(i,j) i 行、j 列の要素にアクセスします。要素の型は double です。カウントは 0 から始まることに注意してください。
M行(1) アクセスライン1
M.col(3) 列 3 にアクセス
M.rowRange(1,4) 行 1 から行 4 にアクセスする
M.colRange(1,4) アクセス列 1 ~ 4
M.rowRange(2,5).colRange(1,3) 行 2 から行 5、列 1 から列 3 にアクセスする
M.diag() 対角線を訪問

クラス cv::Mat のオブジェクトの式
文法 説明
マット M2 = M1.clone() M1のコピーデータM2を作成
マット M2;M1.copyTo(M2) M1 から M2 にデータをコピーする
Mat M1 = Mat::zeros(9,3,CV_32FC3);Mat M2 = M1.reshape(0,3) M1のデータを調整してM2を生成
マット M2 = M1.t() M1の転置
マット M2 = M1.inv() M1 の逆
マット M3 = M1 * M2 M1×M2
マット M2 = M1 + s M1 とスカラー

3. cv::Mat クラスオブジェクトの基本操作

(1) 画像読み込み、画像表示、画像保存

#include <iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    //创建两个个Mat对象
    Mat image,result;
    //显示矩阵的大小
    cout<<"image.width = "<<image.size().width<<" image.height = "<<image.size().height<<endl;

    //读取图片
    image = imread("../images/GuiZhou.jpg");

    //判断图像是否读取成功
    if(!image.data){
        cout<<"read image failed!"<<endl;
    }

    //显示原始图像

    namedWindow("Original image!");
    imshow("Original image!",image);

    //对图像进行水平翻转,并且将翻转之后的结果存放在result矩阵中
    flip(image,result,1);//1-表示水平翻转,0-表示垂直翻转,负数表示上下左右同时翻转

    //显示翻转之后的图像

    namedWindow("flip image!");
    imshow("flip image!",image);

    //将翻转之后的图像保存下来
    imwrite("flip.png",result);

    waitKey(0);
    return 0;
}

元の画像

反転後の画像

 

参考書:

「デジタル画像処理」

おすすめ

転載: blog.csdn.net/Keep_Trying_Go/article/details/130440286