目次
Windows の CodeBlocks は 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 クラス オブジェクトを作成する
文法 | 説明 |
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 ビット浮動小数点数です。 |
文法 | 説明 |
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() | 対角線を訪問 |
文法 | 説明 |
マット 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;
}
元の画像
反転後の画像
参考書:
「デジタル画像処理」