主な理解には以下が含まれます:
- OpenCVのダウンロードと環境設定
- opencv ディレクトリの理解
- opencvのhighguiモジュール
- opencvのコアモジュール
- opencv の imgproc モジュール
- opencv の feature2d モジュール
- openCVビデオ操作
1. OpenCV の概要
画像は人間の視覚の基礎であり、自然の風景を客観的に反映したものです。
- アナログ画像は、特定の物理量の強さの変化を通じて画像情報を記録するため、画像情報は継続的に変換されます。アナログ信号は干渉を受けやすいため、現在では完全にデジタル画像に置き換えられています。
- 明るさを離散的な数値で表現したデジタル画像
- 桁数: 0 ~ 255 のグレースケール画像。0 は最も暗いことを表し、255 は最も白いことを表します。
画像分類
- バイナリ画像: 0 と 1 で構成されるバイナリ画像
- グレー スケール イメージ: 保存には 8 ビットの非線形ピクセル スケールが使用され、256 レベルのグレー スケール、16 ビットの場合は 65536 レベルのグレー スケールになります。
- カラー画像: 通常、8 ビット符号なし整数を使用して、それぞれ (0 ~ 255) の RGB の 3 つの成分で表されます。
1.1 インストールチュートリアル
C++ の場合は、このチュートリアルを参照してください。
Opencv+vs Studio 環境設定_addict_jun のブログ - CSDN blog_opencv_ffmpeg342_64.dll
または、 「リリース - OpenCV」公式 Web サイトに直接ログインし、バージョンを選択して、クリックしてダウンロードします。
Pythonではとても簡単です
ピップインストール
pip install opencv-python == 3.4.2.17
テスト
import cv2
lena = cv2.imread("1.jpg")
cv2.imshow("image",lena)
cv2.waitKey(0)
拡大
pip install opencv-contrib-python==3.4.2.17
1.2 ディレクトリ分析
opencv3.x のバージョンをダウンロードすると、opencv と opencv2 という 2 つのフォルダーがあることがよくわかります。
- opencv フォルダーには古いヘッダー ファイルが含まれています。
- Opencv2 には、画期的な意味を持つ新しい openCV2 シリーズのヘッダー ファイルが含まれています。
OpenCV1.0のコアヘッダファイルもopencvで見ることができ、全体として大きなコンポーネントとして理解できます。
そして私たちの主な関心事は opencv2 フォルダーです。
ここでは、一般的に使用されるモジュールをいくつか紹介します。
- [calib3d]——キャリブレーションと 3D の 2 つの単語の略語。主に、基本的なマルチビュー幾何学的アルゴリズム、単一ステレオ カメラのキャリブレーション、オブジェクトの姿勢推定、ステレオ類似性アルゴリズム、3D などのカメラ キャリブレーションと 3D 再構成関連コンテンツを扱うために使用されます。情報の復旧等
- [コア]——基本データ構造、動的データ構造、描画関数、配列演算関連関数、補助関数、システム関数およびマクロ、openGL 相互運用性などのコア モジュール関数。
- [imgproc]—Image と Process という 2 つの単語の略語の組み合わせ、画像処理モジュール
- 【features2d】——Feature2D、つまり2次元関数フレームワークで、名前を聞くだけで機能に関係していることがわかります。
- [flann]——Fast Library for Aboveimate Nearest Neighborris、高次元の近似最近傍高速検索アルゴリズム ライブラリであり、次の 2 つの部分が含まれます。
- 【gpu】——GPUアクセラレーションを利用したコンピュータビジョンモジュール
- 【highgui】——メディア入出力、ビデオキャプチャ、画像とビデオのエンコードとデコード、グラフィカルインタラクティブインターフェイスなどを含む、高レベルのGUIグラフィカルユーザーインターフェイス。
- [ml]——機械学習モジュール、すごいですね、opencv ならこんなこともできます
- 【objectect】——物体検出モジュール
- [ocl]——OpenCL アクセラレーション コンピュータ コンポーネント モジュール
- 【写真】——画像修復と画像ノイズ除去
- 【スティッチング】——画像スティッチングモジュール
- 【動画】 -- 徐々に動画関連
カタログファイルを通じて、画像分野の知識を大まかに理解することができます。
私の個人的な意見としては、コアモジュールが基盤であり、imgproc、gpu、ocl、videoなどが補助機能で、最上位層が特定のアプリケーションであると考えられます。 、機械学習、ターゲット検出、ノイズ除去、スティッチングはすべて画像の応用分野です。
ディレクトリの分析はここまでで、次のステップは opencv のインストールのチュートリアルです。
highgui は人と対話する端末であり、表示インターフェースは厳密に言えば上位アプリケーションですが、opencv の学習としては、まずコア、その後にさまざまなアプリケーションを学習することになると思います。補助応用は応用過程で学ぶことです。
1.3 OpenCVの利点
OpenCV
- C++ 実装に基づいて、Python、Ruby、Matlab およびその他の言語のインターフェイスも提供します。
- クロスプラットフォーム: Windows、Linux、OS X、Android、iOS。CUDAやOpenCLをベースとした高速GPU操作インターフェースも開発中
- 豊富な API、完全な従来のコンピューター ビジョン アルゴリズム、主流の機械学習アルゴリズムをカバーし、ディープ ラーニングのサポートを追加
OpenCV-Python
- Pythonは可読性が高く、現在主流の言語です
- Python は C++ を使用して簡単に拡張でき、計算負荷の高いコードを C++ で記述し、Python モジュールとして使用でき、C++ と同じくらい高速に実行でき、より簡単に使用、調整、統合できる Python ラッパーを作成
Numpy
できSciPy
ますMatplotlib
。
OpenCV をインストールする前にインストールすることもできます
numpy,matplotlib
。OpenCV 3.4.3 上記の古典的なアルゴリズムの一部は著作権出願のため使用できず、新しいバージョンには特定の制限があります
2 highgui 高レベル GUI グラフィカル ユーザー インターフェイス
主に画像の読み込み、表示、ファイルへの出力などの詳細な解析に使用されます。
2.1 画像の読み取り
パイソン
cv.imread(img, flag)
'''
参数
-要读取的图像
-读取的标志
+ cv.IMREAD*COLOR:以彩色模式加载图片,任何图像的透明度都将被忽略。这是默认参数。
+ cv.IMREAD*GRAYSCALE:以灰度模式加载图像
+ cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式
可以使用1,0或者-1来替代上面三个标志
'''
C++
imread(const string& filename, int flags=1)
/*
参数:
+ 文件名
+ 标志位,以不同的颜色读取图片
*/
2.2 表示画像
パイソン
cv.imshow(name, img)
'''
参数
-显示图像的窗口名称,以字符串类型表示
-要加载的图像
注意:在调用显示图像API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,导致图像无法显示出来。
'''
#opencv中显示
cv.imshow("image", img)
cv.waitKey(0)
# matplotlib中展示
'''因为cv中采用BGR进行存储,这里需要转换成RGB的'''
plt.imshow(img[:,:,::-1])
plt.show()
C++
imshow(const string& winname, InputArray mat)'
/*
参数:
+ 显示窗口的名称
+ 显示的图像
*/
// 创建namedWindow()函数
// 如果只是简单使用窗口,imread和imshow就足够了,但是如果需要添加比如滑动条的创建等操作时,则需要使用namedWindow来先创建窗口。
void nameWindow(const string & winname, int flags=WINDOW_AUTOSIZE)
//创建滑动条
createTrackbar()
//滑动条的使用
int getTrackbarPos(const string& trackbarname, const string& winname)
//opencv中的鼠标操作
void setMouseVallback(conststring& winname, MouseCallback onMouse)
2.3 画像を保存する
パイソン
cv.imwrite(name, img)
'''
参数:
- 文件名,要保存在哪里
- 要保存的图像
'''
C++
bool imwrite(cosnt string& filename, InputArray img, const vector<int>& params=vector<int>());
3コアコアモジュール
基本的なデータ構造である Mat は、2.0 時代の oepnCV の主な焦点です。Mat のようなデータ構造を主な焦点として使用した後、OpenCV はますます Matlab に似てきました。プログラミング スキルはほとんど必要なく、非常に簡単です。始めましょう。
- opencv関数における出力画像のメモリ割り当ては自動的に行われます。
- opencv の C++ インターフェイスを使用する場合、メモリ解放の問題を考慮する必要はありません。
- 代入演算子とコピーコンストラクターはヘッダーのみをコピーします
- 画像の行列をコピーするには、 clone() または copyTo() を使用します。
3.1 画素値の保存方法
- RGB が最も一般的で、人間の目と同様に機能します。
- HSV と HLS は、色を色相、彩度、明度、明度に分解します。
- YCrCb は JPEG 画像形式で広く使用されています
- CIE L*a*b* は、2 つの色の間の距離を測定するのに適した知覚的に均一な色空間です。
3.2 一般的なデータ構造
- 画像表現:Matクラス
- ポイント表現: ポイントクラス
- 色表現:スカラークラス
- サイズ表記:サイズクラス
- 行列表現: Rect クラス
- 色空間変換: cvtColor() 関数
3.3 描画機能
基本的なグラフィックスの描画
- 直線を引くline関数
cv.line(img,start,end,color,thickness)
'''
参数
-img:要绘制直线的图像
-Start,end:直线的起点和终点
-color:线条的颜色
-Thickness:线条宽度
'''
- 楕円を描くためのellipse関数
- 長方形を描くrectangle関数
cv.rectangle(img, leftupper, rightdown, color, thickness)
'''
参数
-img:要绘制矩形的图像
-Leftupper,rightdown:矩形的左上角和右下角坐标
-color:线条的颜色
-Thickness:线条的宽度
'''
- 円を描くcircle関数
cv.circle(img, centerpoint, r, color, thickness)
'''
参数
-img:要绘制圆形的图像
-Centerpoint,r:圆心和半径
-color:线条的颜色
-Thickness:线条的宽度,为-1时,会填充颜色
'''
- 塗りつぶされた多角形を描画するための fillPoly 関数
画像にテキストを追加する必要がある場合
cv.putText(画像、テキスト、ステーション、フォント、フォントサイズ、色、太さ、cv.LINE_AA)
''
パラメータ
-img: 画像
-text: 書き込むテキストデータ
-station: テキストの位置制御
-font: フォント
-Fontsize: フォントサイズ
''
3.4 配列演算関連関数
画像要素にアクセスする
- LUT機能、ルックアップテーブル操作
- タイミング関数、getTickCount()、getTickFrequency()
- 画像内のピクセルにアクセスする
- ポインタアクセス
- イテレータアクセス
- 動的アドレス計算
- ROI 関心領域: 四角形を使用、範囲: 開始インデックスから終了インデックスまで。
- リニアブレンディング操作:表裏ページ切り替えによる折り効果
- 配列の加重和を計算する: addWeighted() 関数
- チャンネル分離:split()関数
- チャネルのマージ: merge() 関数
- 画像のコントラスト、明るさの値の調整
- 離散フーリエ変換: 簡単に言えば、画像はサインとコサインの 2 つの部分に分解されます。また、2 次元ベクトルの大きさ、自然対数、行列の正規化などの数学的演算も含まれます。
- XMLおよびYAMLファイルの操作
以下はPythonでの説明です
画像のプロパティには、行、列、チャネルの数、画像データ タイプ、ピクセル数などが含まれます。
img.shape
img.dtype
img.size #像素个数
画像チャンネルの分割と結合
場合によっては、B、G、R チャンネルの画像を個別に作業する必要があります。この場合、BGR 画像を個別のチャネルに分割する必要があります。または、他の場合には、これらの個々のチャネルを BGR イメージにマージする必要がある場合があります。次の方法で行うことができます。
#拆分通道
b,g,r = cv.split(img)
#通道合并
img = cv.merge((b,g,r))
色空間の変更
OpenCV には 150 以上の色空間変換メソッドがあります。最も広く使用されている変換方法は、BGR "" Gray と BGR "" HSV の 2 つです。
cv.cvtColor(input_image, flag)
'''
参数
-input_image:进行颜色空间转换的图像
-flag:转换类型
+ cv.COLOR_BGR2GRAY:
+ cv.COLOR_BGR2HSV:
'''
画像追加
OpenCV 関数を使用してcv.add()
2 つのイメージを追加することも、res = img1 + img2 などの numpy 操作を通じて単純に 2 つのイメージを追加することもできます。両方のイメージは同じサイズとタイプでなければなりません。そうでない場合は、2 番目のイメージをスカラー値にすることができます。
注: OpenCV の追加と Numpy の追加には違いがあります。OpenCV の加算は飽和演算ですが、Numpy の加算はモジュロ演算です。
画像のブレンド
これは実際には足し算ですが、違いは 2 つの画像のウェイトが異なることです。これにより、人に溶け込みや透明感が与えられます。
cv.addWeighted(img1, 0.7, img2, 0.3, 0)
一般的なシステムは上図のとおりだと思いますが、最下層がデータで、そのデータを操作するのが上位層で、これは昔からそうだと思います。
4 imgproc 画像処理
4.1 従来の画像処理
従来の画像処理の知識には主に次のものがあります。
- 3 つの線形フィルター: ボックス フィルター、平均フィルター、ガウス フィルター。
- 2 つの非線形フィルター: メディアン フィルターとバイラテラル フィルター。
- 7 つの画像処理モルフォロジー: 侵食、拡張、オープニング操作、クロージング操作、モルフォロジー勾配、トップ ハット、ブラック ハット。
- 塗りつぶし
- 画像のスケーリング
- 画像ピラミッド
- 閾値処理
4.1.1 3種類の線形フィルタ
- ボックスフィルター
- 平均フィルタリング
- ガウスフィルター
4.1.2 非線形フィルタリング
- メディアンフィルター
- 双方向フィルタリング
4.1.3 形態学
動植物の形態と構造を研究する生物学の分野に由来します。私たちの画像処理の形態学は、多くの場合、数学的形態学を指します。
- 拡張: 白いハイライトを拡張します。
- 腐食:白くハイライトされた部分が腐食します。
- 開口操作: 最初に腐食し、次に拡張します。ハイライト部分を分離したり、小さなオブジェクトを削除したりする
- 閉じた操作、最初に膨張、腐食。小さなオブジェクトを提案する操作は、低輝度部分に対して実行されます。
- 形態学的勾配: 拡張マップと侵食マップの違い。塊のエッジを強調表示できます。
- トップハット: 演算結果と元の画像の差。背景の抽出に使用されます。
- ブラックハット: クローズド計算の結果画像と元の画像の差。
4.1.4 埋め込み
私の理解では、絵を描いて円を描き、中央の白を他の色で塗りつぶすのと同じように、色を選択し、それを他の色で塗りつぶすということです。
4.1.5 画像ピラミッド
ここではまず 2 つの概念を紹介します
- 画像のアップサンプリング
- 画像のダウンサンプリング
画像ピラミッドとは、最高解像度から一定の終了条件を満たすまで段階的に降下していく画像であり、この多重解像度画像の集合を画像ピラミッドと呼びます。
4.1.5 しきい値処理
簡単に言えば、ある閾値を超えたピクセルを再定義することです。
Pythonはしきい値を設定します
オプション | ピクセル値>閾値 | その他のケース |
---|---|---|
cv2.THRESH_BINARY | マックスヴァル | 0 |
cv2.THRESH_BINARY_INV | 0 | マックスヴァル |
cv2.THRESH_TRUNC | 脱穀する | 現在のグレー値 |
cv2.THRESH_TOZERO | 現在のグレー値 | 0 |
cv2.THRESH_TOZERO_INV | 0 | 現在のグレー値 |
cv2.threshold(src, thresh, maxval, type[, dst])
'''
参数:
-src:灰度图片
-thresh:起始阈值
-maxval:最大值
-type:如上表的关系
'''
これが正式なオリンピックの輪です。
4.2 imgproc 画像変換
4.2.1 エッジ検出
一般的な手順:
- フィルタリング: これは、上記で一般的に使用されるガウス フィルタリング、線形フィルタリングなどです。
- 強化: 各ポイントの電界強度の変化値を計算することにより、大きな変化のあるポイントが強調表示されます。
- 検出:フィールド内の変化が大きい点をスクリーニングすることも必要
賢いオペレーター
彼は 1986 年に開発されたエッジ検出コンピューティング理論の創始者です。
- 低いエラー率: ノイズによる誤検知を最小限に抑えながら、できるだけ多くの実際のエッジを表現します。
- 高度なローカライゼーション: マークされたエッジは、画像内の実際のエッジに可能な限り近くなければなりません。
- 最小限の応答: 画像内のエッジは 1 回だけ識別できるため、考えられる画像ノイズはエッジとして表現されるべきではありません。
ソーベル演算子
sobel 演算子は、主にエッジ検出に使用される離散微分演算子です。
ラプラシアン演算子
この演算子は、n が勾配 grad の発散 div として定義されるユークリッド空間の 2 次微分演算子です。
シャルフィルター
名前の通りフィルターですが、ソーベルオペレーターの動作に協力するために存在します。
4.2.2ハフ変換
幾何学的形状を認識するための基本的な方法の 1 つ。
4.2.3 マッピング変換
リマップ
ピクセル座標を再マップします。
アフィン変換
このように考えると、主に画像のズーム、回転、平行移動などの操作の組み合わせであることが分かります。
伝送変換
投影変換は視野角の変化の結果であり、視点中心、像点、目標点が同一線上にあるという条件を利用し、透視回転の法則に従って支持面(透視面)を利用することを指します。 ) は、トレース ライン (透視軸) を中心に特定の角度だけ回転します。元の投影された光線を破壊しても、像担持面上の投影された幾何学的図形の変形は変化しないまま維持されます。
4.2.4 ヒストグラムの等化
ヒストグラムの頻度を計算し、それを均等に分布することです。
5 opencv の feature2d コンポーネント
画像の特徴は3種類に分けられる
- 角
- コーナーポイント(重要な見どころ)
- blob (対象領域)
5.1 コーナー検出
コーナーポイントの印象はエッジポイントと少し似ていて、ポイントの周囲は一方向に沿って明らかに明るさが変化します。
- ハリスコーナー検出
- シ・トマシコーナー検出
dst = cv.cornerHarris(src, blockSize, Ksize, k)
'''
参数
-img:数据类型为float32的输入图像
-blockSize:角点检测中要考虑的领域大小
-ksize:sobel求导使用的核大小
-k:角点检测方程中的自由参数,取值参数为【0.04,0.06】
'''
corners = cv2.goodFeaturesToTrack(image, maxcorners, qualityLevel, minDistance)
'''
参数
-image:输入灰度图像
-maxCorners:获取角点数的数目
-qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间
-minDistance:角点之间最小的欧式距离,避免得到相邻特征点
返回
-corners:搜索到的角点,在这里所有低于质量水平的角点被排除掉了。
'''
- サブピクセルコーナー検出
5.2 特徴の検出とマッチング
- 速い
- 星
- シフト
- サーフィン
- 魂晶
- MSER
- GFTT
- ハリス
- 密集
- シンプルブロブ
上記は 10 個の特徴検出アルゴリズムです
シフト
sitf = cv.xfeatures2d.SIFT_create()
kp,des = sift.detectAndCompute(gray, None)
'''
参数
-gray:进行关键点检测的图像,注意是灰度图像
返回:
-kp:关键点信息,包括位置,尺度,方向信息
-des:关键点描述符,每个关键点对应128个梯度信息的特征向量
'''
cv.drawKeypoints(image, keypoints, outputimage, color, flags)
'''
参数:
-image:原始图像
-keypoints:关键点信息,将其绘制在图像上
-outputimage:输出图片,可以是原始图像
-color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色
-flag:绘图功能
+cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配特征点,每一个关键点只绘制中间点
+cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
+cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
+cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:单点的特征点不被绘制
'''
速い
fast = cv.FastFeatureDetector_create(threshold, nonmaxSuppression)
'''
参数
-threshold:阈值t,有默认值10
-nonmaxSuppression:是否进行非极大值抑制,默认值True
返回
-Fast:创建FastFeatureDetector对象
'''
kp = fast.detect(grayImg, None)
'''
参数
-gray:进行关键点检测的图像,注意是灰度图像
返回
-kp:关键点信息,包括位置,尺度,方向
'''
cv.drawKey(image, keypoints, outputimage, color, flags)
ORBアルゴリズム
orb = cv.xfeatures2d.orb_create(nfeatures)
'''
-nfeatures:特征点的最大数量
'''
kp, dex = orb.detectAndCompute(gray,None)
'''
参数
-gray:进行关键点检测的图像,注意是灰度图像
返回
-kp:关键点
-res:描述符
'''
cv.deawKeypoints(image, keypoints, outputimage, color, flags)
画像分野の発展に伴い、feature2d はディープ ラーニングなどのより高レベルのアプリケーションの補助的な画像処理として使用されることが多くなりました。最後に、ビデオ操作について学び、opencv の基本的な理解を完了しました。
6 ビデオ操作
6.1 ビデオの読み取り
OpenCV では、ビデオを取得したいので、VideoCapture オブジェクトを作成し、読み込むビデオ ファイルを指定する必要があります。
#创建读取视频的对象
cap = cv.VideoCapture(filepath)
'''
参数
-filepath:视频文件路径
'''
#获取视频的某些属性
retval = cap.get(propId)
'''
参数
-propId:从0到18的数字,每个数字表示视频的属性
'''
#修改视频的属性信息
retval = cap.set(propId, value)
#判断是否读取成功
isornot = cap.isOpened()
#获取视频的一帧图像
ret, frame = cap.read()
'''
返回
-ret:成功则返回true
-Frame:获取到的某一帧图像
'''
#显示
cv.imshow()
#释放调视频对象
cap.realease()
6.2 ビデオを保存する
VedioWriter オブジェクトを使用してビデオを保存する
out = cv2.VideoWriter(filename, fourcc, fps, frameSize)
'''
参数
-filename:视频保存的位置
-fourcc:指定视频编解码器的4字节代码
-fps:帧率
-frameSize:帧大小
'''
retval = cv2.VideoWriter_fourcc(c1, c2, c3, c4)
'''
参数
-c1,c2,c3,c4:是视频编码器的4字节代码,在fourcc.org中可以找到代码列表,与平台紧密相关
'''
要約する
opencvの基礎となるコア、基本的な画像操作、画像処理内容を中心に解説します。