OpenCVの一般的に使用されるAPIの概要(クイッククエリ)

OpenCVの基本操作

Matplotlib 中国語表示

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
openCVのインストール
pip install opencv-python==3.4.2.17
pip install opencv-contrib-python==3.4.2.17
#国内清华镜像
-i https://pypi.tuna.tsinghua.edu.cn/simple
# 设置清华镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
画像の読み込み(IO動作)
import cv2
# 读一个图片并进行显示(图片路径需自己指定)
img=cv2.imread("1.jpg")
cv2.imshow("image",img)
cv2.waitKey(0)

# 保存图片
cv.imwrite('messigray.png',img)
コレクショングラフィックを描く
# 绘制直线
# 绘制直线
cv.line()
# 绘制直线
cv.circle()
# 绘制直线
cv.rectangle()
# 向图像中增加文字
cv.putText()
画像の追加とブレンド操作
# 图像加法
cv.add()
#2 图像混合
cv.addWeighted()

OpenCV画像処理


画像の幾何学的変換
#1 图像缩放
cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
#2 图像平移
cv.warpAffine(img,M,dsize)
#3 图像旋转
cv2.getRotationMatrix2D(center, angle, scale) -> cv.warpAffine(img,M,dsize)
#4 仿射变换
cv2.getAffineTransform() -> cv.warpAffine(img,M,dsize)
#5 透射变换
cv.getPerspectiveTransform() -> cv.warpAffine(img,M,dsize)
#6 图像金字塔
cv.pyrUp(img)       #对图像进行上采样
cv.pyrDown(img)        #对图像进行下采样
形態学的操作
# 腐蚀   
cv.erode(img,kernel,iterations)
# 膨胀
cv.dilate(img,kernel,iterations)
# 开运算  闭运算
cv.morphologyEx(img, op, kernel) # op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭运算,则设为cv.MORPH_CLOSE
# 礼帽和黑帽
cv.morphologyEx(img, op, kernel)#  op: 处理方式:若进行开运算,则设为cv.MORPH_TOPHAT,若进行闭运算,则设为cv.BLACKHAT
画像の平滑化
#均值滤波
cv.blur(src, ksize, anchor, borderType)
#高斯滤波
cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
#中值滤波
cv.medianBlur(src, ksize)
ヒストグラム
# mask -> 直方图
cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

'''
images: 原图像。当传入函数时应该用中括号 [] 括起来,例如:[img]。
channels: 如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。   
mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)   
histSize:BIN 的数目。也应该用中括号括起来,例如:[256]。   
ranges: 像素值范围,通常为 [0,256]
'''
# 掩模
mask -> cv.bitwise_and
# 直方图均衡化
dst = cv.equalizeHist(img)
#自适应的直方图均衡化
cv.createCLAHE(clipLimit, tileGridSize)
'''
clipLimit: 对比度限制,默认是40
tileGridSize: 分块的大小,默认为8*88∗8
'''
エッジ検出
#sobel边缘检测
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
'''
src:传入的图像
ddepth: 图像的深度
dx和dy: 指求导的阶数,0表示这个方向上没有求导,取值为0、1。
ksize: 是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。
注意:如果ksize=-1,就演变成为3x3的Scharr算子。
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
borderType:图像边界的模式,默认值为cv2.BORDER_DEFAULT。
'''
# Laplacian算子
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
'''
Src: 需要处理的图像,
Ddepth: 图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度;
ksize:算子的大小,即卷积核的大小,必须为1,3,5,7。
'''
# Canny边缘检测
canny = cv2.Canny(image, threshold1, threshold2)
'''
image:灰度图,
threshold1: minval,较小的阈值将间断的边缘连接起来
threshold2: maxval,较大的阈值检测图像中明显的边缘
'''
テンプレートマッチング
# 模板匹配
res = cv.matchTemplate(img,template,method)
'''
img: 要进行模板匹配的图像
Template :模板
method:实现模板匹配的算法,主要有:
平方差匹配(CV_TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
相关匹配(CV_TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
利用相关系数匹配(CV_TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
'''
#霍夫线检测
# 1 线性检测
cv.HoughLines(img, rho, theta, threshold)
# 2 圆环检测
circles = cv.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0,maxRadius=0 )
フーリエ変換
# 变换
dft = cv2.dft(src, dst=None)
# 逆变换
img = cv.idft(dft)
輪郭検出
# 查找轮廓
binary, contours, hierarchy = cv2.findContours(img, mode, method)
# 绘制轮廓
cv2.drawContours(img, contours, index, color, width)
'''
面积:ContourArea()
周长:ArcLength()
轮廓近似:approxPolyDP() 逼近图像的多边形曲线
凸包:ConvexHull()
边界矩形:BoundingRect()和MinAreaRect()
最小外接圆:MinEnclosingCircle()
椭圆拟合:fitEllipse()
直线拟合:fitline()
'''
画像のセグメンテーション

グローバルな値のセグメンテーション

ret,th = threshold(src, thresh, maxval, type)
  • src: 処理される画像、通常はグレースケール画像
  • thresh: しきい値を設定します
  • maxval: グレースケールの最大値、通常は 255、閾値分割の最大値の値を示すために使用され、主に閾値の 2 値化と閾値の非 2 値化を指します。
  • タイプ: しきい値セグメント化方法。主な値は次の 5 つです。
    1. しきい値バイナリ (しきい値バイナリ)
    2. しきい値逆バイナリ (しきい値バイナリ反転)
    3. 切り捨て (truncate)
    4. しきい値ゼロ (しきい値をゼロ)
    5. しきい値をゼロに反転 (しきい値をゼロに反転)
    適応型アドバンス セグメンテーション
dst = cv.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
  • src: 入力画像、通常はグレースケール画像

  • Maxval: グレー スケールの最大値 (通常は 255)。ピクセルがしきい値 (タイプ タイプに関連) を超えるか未満であることを示すために使用され、割り当てられる最大値

  • thresh_type : 閾値の計算方法、主に以下の2種類 cv2.ADAPTIVE_THRESH_MEAN_C : 近傍のピクセル値の平均値

  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 近傍のピクセル値のガウス カーネル加重合計

  • type: しきい値モード。しきい値の入力と同じ意味です。

  • block_size: ローカルしきい値を計算するときに近傍のサイズが取得されます。これを 11 に設定すると、近傍範囲 11*11 が取得され、これは通常は奇数になります。

  • C: 閾値計算方法の定数項、つまり最終的な閾値は近傍で計算した閾値と定数項の差です。

グローバルな値のセグメンテーション

res = watershed(image,markers)
  • mage: 入力画像は 8 ビット 3 チャンネルのカラー画像である必要があります
  • マーカー: 輪郭情報をシード ポイントとして使用する、シード ポイント情報を含むマーカー イメージ、32 ビット シングル チャネル画像。分水嶺アルゴリズムを実行する前に、マーカー情報を設定する必要があります。これには、さまざまな領域の等高線が含まれています。各等高線には一意の番号があります。等高線の位置を決定するには、findCountours メソッドを使用します。さまざまな領域の結合位置は -1 です。

グラブカットアルゴリズム

grabCut(img,mask,rect,bgdModel,fgdModel,iterCount,mode )
  • img: 入力画像。8 ビット 3 チャンネルのカラー画像である必要があります。
  • マスク: マスク画像。マスクが初期化に使用される場合、マスクは初期化マスク情報を保存します。ユーザー対話によって設定された前景と背景もマスクに保存し、その後、grabCut 関数に渡すことができます。処理後、完了すると、結果はマスクに保存されます。マスクは次の値のみを取ることができます: 0 (背景)、1 (前景)、2 (可能性のある前景)、3 (可能性のある背景)
  • rect: セグメント化する必要がある画像範囲を制限するために使用され、長方形ウィンドウ内の画像部分のみが処理されます。
  • bgdModel: 背景モデル。None の場合、bgdModel は関数内で自動的に作成されます。bgdModel はシングルチャネル浮動小数点イメージである必要があり、行数は 1 のみ、列数は 1 つだけです。 13x5
  • fgdModel: 前景モデル。None の場合、関数内で fgdModel が自動的に作成されます。fgdModel はシングル チャネルの浮動小数点イメージである必要があり、行数は 1 のみ、列数は 1 のみです。 13x5
  • iterCount: 反復回数。0 より大きい必要があります。
  • mode: グラブカット関数が実行する操作を示します。 cv.GC_INIT_WITH_RECT (長方形のウィンドウ カットアウト) cv.GC_INIT_WITH_MASK (マスク カットアウトを使用)

画像特徴抽出

#Harris角点检测
dst=cv.cornerHarris(src, blockSize, ksize, k)
  • img: データ型 Float32 の入力画像。
  • blockSize: コーナー検出で考慮する近傍のサイズ。
  • ksize: ソーベル導出に使用されるカーネル サイズ
  • k : コーナー検出式の自由パラメータ。値パラメータは [0.04, 0.06] です。
#Shi-Tomasi角点检测
corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )
  • 画像: 入​​力グレースケール画像
  • maxCorners : コーナーの数を取得します。
  • qualityLevel: このパラメータは、許容可能な最小コーナー品質レベルを 0 ~ 1 の範囲で示します。
  • minDistance: 隣接する特徴点の取得を避けるためのコーナー点間の最小ユークリッド距離。
SIFT が重要なポイントを検出
# 实例化sift
sift = cv.xfeatures2d.SIFT_create()
# 利用sift.detectAndCompute()检测关键点并计算
kp,des = sift.detectAndCompute(gray,None)
#将关键点检测结果绘制在图像上
cv.drawKeypoints(image, keypoints, outputimage, color, flags)
  • 画像: オリジナル画像
  • keypoints: キーポイント情報、画像上に描画します
  • Outputimage: 出力画像。元の画像にすることもできます。
  • color: カラー設定。(b、g、r) の値を変更してブラシの色を変更します。b=青、g=緑、r=赤。
  • flags: 描画関数のフラグ設定
    1. cv2.DRAW_MATCHES_FLAGS_DEFAULT: 出力イメージ行列を作成し、既存の出力イメージを使用して一致するペアと特徴点を描画し、各キー ポイントの中間点のみを描画します。
    2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG: 出力イメージ行列を作成せず、出力イメージ上に一致するペアを描画します
    3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: 各特徴点のサイズと方向を指定してキー ポイント グラフィックを描画します
    4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS: 単一点の特徴点は描画されません

ビデオの読み取りと書き込み

  1. ビデオを読んでください:

    • ビデオの読み取り: cap = cv.VideoCapture()
    • 読み込み成功の判定:cap.isOpened()
    • 各フレーム画像を読み取る: ret, Frame = cap.read()
    • 属性の取得: cap.get(proid)
    • プロパティを設定します: cap.set(proid,value)
    • リソースリリース: cap.release()
  2. ビデオを保存する

    • ビデオを保存: out = cv.VideoWrite()
    • ビデオの書き込み: out.write()
    • リソースのリリース: out.release()
# Meanshift
cv.meanShift(probImage, window, criteria)
ret, track_window = cv.CamShift(dst, track_window, term_crit)
    
# 绘制追踪结果
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame,[pts],True, 255,2)

参考ドキュメント OpenCV公式チュートリアル

Guess you like

Origin blog.csdn.net/Peyzhang/article/details/125923154