Python サードパーティ cv2 ライブラリの概要
CV2 は、オープンソース ライブラリ プラットフォームのコンピュータ ビジョン ライブラリである OpenCV2 (Open Source Computer Vision Library) を指します。強力な画像処理機能を備えており、画像処理やコンピュータビジョンにおける多くの一般的なアルゴリズムを実現できます。
OpenCV 公式 Web サイトのドキュメントhttps://docs.opencv.org/4.1.2/d6/d00/tutorial_py_root.html
中国語ドキュメントhttp://www.woshicver.com/
特別な注意: インストールするときは opencv_python を使用しますが、インポートして使用するときは cv2 を使用します。
Windows 環境の場合、Python モジュール (ライブラリ、パッケージ) のインストール コマンド形式 (cmd):
[py -XY -m] pip install [-i ミラー URL] モジュール (ライブラリ、パッケージ) 名
[]部分はオプションを示します
複数の Python バージョンがインストールされている場合、XY は Python バージョンを表し、冗長な部分は破棄されます。たとえば、3.8 は 3.8.1 として取得され、3.10 は 3.10.5 として取得され、つまり 2 番目のポイントより前の部分のみが取得されます。取られます。インストールされている Python バージョンが 1 つだけの場合は必要ありません。
ミラー URL を使用すると、インストールを高速化できます。一般的に使用されるミラー URL
清華: https://pypi.tuna.tsinghua.edu.cn/simple
アリババクラウド: https://mirrors.aliyun.com/pypi/simple/
中国科学技術大学 https://pypi.mirrors.ustc.edu.cn/simple/
【https://blog.csdn.net/cnds123/article/details/104393385を参照】
ここではそれを使用します (バージョン 3.9.1 の cv2 ライブラリをインストールするために複数の Python バージョンをインストールしました - opencv_python、Alibaba Cloud ミラーを使用します。インストール時は opencv_python ですが、インポート時には import cv2 が使用されます。):
py -3.10 –m pip install -i https://mirrors.aliyun.com/pypi/simple/opencv_python
以下の図を参照してください。
最後にインストールを確認します
注: cv2 ライブラリを使用する場合、ファイル名とパスに漢字を含めることはできません。漢字が含まれると、さまざまな不可解なエラーが発生します。
画像を読み取って表示する
画像を読み取る関数: cv2.imread(filepath,flags)
filepath は画像のパスを表します
フラグはどの画像を読み取るかを示します。
(1) cv2.IMREAD_COLOR: デフォルトのパラメータ、カラー画像で読み取り、アルファチャンネルを無視します (または 1 を直接書き込みます)
(2) cv2.IMREAD_GRAYSCALE: グレースケール画像を読み込みます (または 0 を直接書き込みます)
画像を表示する関数: cv2.imshow(window_name, image)
このうち、第一引数はウィンドウ名、第二引数は表示する画像です。
キーボードバインディング関数 cv2.waitKey(lay)
遅延の単位は ms ミリ秒です。遅延が 0 より大きい値を取ると、プログラムはユーザーがキーを押して指定された遅延時間内にグラフィック表示ウィンドウを閉じるのを待つか、グラフィックを閉じる時間が経過するまで待機します。表示ウィンドウ。遅延が 0 に設定されている場合は、グラフィック表示ウィンドウを閉じるために任意のキーを押すのを待機していることを意味します。
これがないと、プログラムが終了するとすぐにグラフィック表示ウィンドウが閉じられます。
ヒント: この関数の効果は、py スクリプト ファイルをダブルクリックして実行するなど、IDLE 環境を終了した場合にのみ確認できます。
画像を読み込んで表示するためのソースコードを以下に示します。
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
cv2.imshow("image1",image1)
cv2.waitKey(0)
それを実行します:
画像を保存する
関数 cv2.imwrite() は、指定されたファイルにイメージを保存するために使用されます。
cv2.imwrite(ファイル名, img [, paras])
パラメータの説明:
filename: 保存するファイルのパスと名前 (ファイル拡張子を含む)
img: 保存する OpenCV イメージ、nparray 多次元配列
paras: 異なるエンコード形式のパラメータ、オプション
カラー写真をグレースケール写真に変換して保存する
ソースコードは次のとおりです。
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png",0)
cv2.imwrite(r"D:/cv2Demo/lotus2As.png",image1)
画像のスケーリング
画像スケーリング関数 cv2.resize(image, image2,dsize)
元の画像を入力、新しい画像を出力、画像のサイズ)
cv2.resize(src, dsize[, dst[, fx[, fy[, 補間]]]])
パラメータの説明:
scr: 変換操作の入力画像
dsize: 出力画像のサイズ、2 つのタプル (幅、高さ)
dst: 変換操作の出力イメージ、オプション
fx、fy: x 軸と y 軸のスケール、実数型、オプション
補間: 補間方法、整数、オプション
cv2.INTER_LINEAR: 双線形補間 (デフォルトの方法)
cv2.INTER_AREA: ピクセル領域関係のリサンプリングを使用して、画像を縮小する際の波紋を回避します。
cv2.INTER_NEAREST: 最近傍補間
cv2.INTER_CUBIC: 4x4 ピクセル近傍のバイキュービック補間
cv2.INTER_LANCZOS4: 8x8 ピクセル近傍のランチョス補間
画像は元の 1/4 に縮小されます
ソースコードは次のとおりです。
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
print(image1.shape) #
height, width = image1.shape[:2] # 获取图片的高度和宽度
image2=cv2.resize(image1,(int(0.5*width), int(0.5*height)))
print(image2.shape) #
cv2.imwrite(r"D:/cv2Demo/lotus2Quarter.png",image2)#保存
画像反転
画像反転関数 cv2.flip(src,flipCode[,dst])
パラメータの説明:
scr: 変換操作の入力画像
flickCode: 制御パラメータ、整数 (int)、flipCode>0 水平反転、flipCode=0 垂直反転、flipCode<0 水平および垂直反転
dst: 変換操作の出力イメージ、オプション
画像反転のソースコード:
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
imgFlip1 = cv2.flip(image1, 1) # 0垂直翻转 ;1水平翻转 ;-1水平和垂直翻转
cv2.imshow("image2",imgFlip1)
cv2.waitKey(0)
画像の回転
画像の直角多重回転機能を実現 cv2.rotate(src,rotateCode[,dst])
cv2.rotate() は 2D 配列 (配列) を 90 度の倍数で回転させ、高速です。
パラメータの説明:
src: 変換操作の入力画像
rotateCode: 列挙型、回転角度を指定します。
cv2.ROTATE_90_CLOCKWISE: 時計回りに 90 度回転します
cv2.ROTATE_180: 180 度回転
cv2.ROTATE_90_COUNTERCLOCKWISE: 反時計回りに 90 度回転します
dst: src 画像と同じサイズと深さの出力画像です。これはオプションのパラメータです。
画像は時計回りに 90 度回転します ソースコード:
import cv2
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = cv2.rotate(image1,cv2.ROTATE_90_CLOCKWISE) #顺时针旋转90度
cv2.imshow("image2",image2)
cv2.waitKey(0)
以下では、任意の角度での画像の回転を紹介します。最初に 2 つの関数の使用を紹介します。
回転変換行列関数の取得 cv2.getRotationMatrix2D(center, angle,scale)
パラメータの説明:
center: 回転中心座標、2 つのタプル (x0, y0)
angle: 回転角度、単位は角度、反時計回りは正の数、時計回りは負の数
スケール: スケール係数
変換行列を使用してイメージ関数 cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) を変換します
の:
src - 入力画像。
M - 変換行列。
dsize - 出力イメージのサイズ。
flags - 補間方法の組み合わせ (int 型!)
borderMode - 境界ピクセルモード (int 型!)
borderValue - (重要!) 境界線のパディング値。デフォルトでは 0 です。
以下に、画像を任意の角度で回転するための 3 つの実装方法を紹介します。
方法 1.ソース コードで任意の角度で画像を回転 (クリッピングあり)
ソースコードは次のとおりです。
#图像旋转任意角度源码(有剪裁)
import cv2
#第一个参数穿opencv读取的图像,第二个参数传入需要旋转的角度
def rotate_bound(image, angle):
height, width = image.shape[:2] # 取前两个值(H,W)
# 第一个参数旋转中心,第二个参数旋转角度,第三个参数缩放比例
center = ( width//2,height//2) # 以图像中心为旋转中心
scale = 1 # 等比例旋转,即旋转后尺度不变
# 获得旋转矩阵
M = cv2.getRotationMatrix2D(center, -angle, scale)
# 进行仿射变换,其中
#“,borderValue=(255,255,255)”定义边界填充色彩白色,省略默认黑色,相当于borderValue=(0,0,0)
return cv2.warpAffine(image, M, (width, height),borderValue=(255,255,255))
image1 = cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = rotate_bound(image1, 45)
cv2.imshow('image', image2) #显示图片
cv2.waitKey(0)
方法 2. ソース コードで任意の角度で画像を回転 (クリッピングなし)
ソースコードは次のとおりです。
#图像旋转任意角度源码(无剪裁)
import numpy as np
import cv2
#第一个参数穿opencv读取的图像,第二个参数传入需要旋转的角度
def rotate_bound(image, angle):
# 获取图像的尺寸,并确定中心
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)
# 获取旋转矩阵(应用角度的负数以顺时针旋转)
# 获取正弦和余弦(即矩阵的旋转分量)
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
#计算图像的新边界尺寸
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
# 调整矩阵
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
#进行仿射变换,其中
#“,borderValue=(255,255,255)”定义边界填充色彩白色,省略默认黑色,相当于borderValue=(0,0,0)
return cv2.warpAffine(image, M, (nW, nH),borderValue=(255,255,255))
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = rotate_bound(image1, 45)
cv2.imshow('image', image2) #显示图片
cv2.waitKey(0)
#cv2.imwrite(r"D:/cv2Demo/lotus2AsSave.png", image2) #保存
方法 3. ソース コードで任意の角度で画像を回転 (クリッピングなし 2)
ソースコードは次のとおりです (方法 2 と比較してください)。
#图像旋转任意角度源码(无剪裁之二)
import cv2
import numpy as np
def opencv_rotate(img, angle):
h, w = img.shape[:2] # 图像的(行数,列数,色彩通道数)
center = (w / 2, h / 2)
scale = 1.0
# 1 获取M矩阵
# cv2.getRotationMatrix2D(获得仿射变化矩阵)
M = cv2.getRotationMatrix2D(center, -angle, scale)
# 2 扩大画布,新的宽高,radians(angle) 把角度转为弧度 sin(弧度)
new_H = int(w * np.fabs(np.sin(np.radians(angle))) + h * np.fabs(np.cos(np.radians(angle))))
new_W = int(h * np.fabs(np.sin(np.radians(angle))) + w * np.fabs(np.cos(np.radians(angle))))
# 3 平移
M[0, 2] += (new_W - w) / 2
M[1, 2] += (new_H - h) / 2
# cv2.warpAffine(进行仿射变化)
rotate = cv2.warpAffine(img, M, (new_W, new_H), borderValue= (0, 0, 0))
return rotate
image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
image2 = opencv_rotate(image1, 45)
cv2.imshow('image', image2) #显示图片
cv2.waitKey(0)
#cv2.imwrite(r"D:/cv2Demo/lotus2AsSave.png", image2) #保存
OK!