OpenCVのエントリ(C ++)

OpenCVの(C ++)ははじめに

私たちは新しい一般的な知識は非常に混同されます表示されたら、私はどこから始めれば分からない、そして今日私が先頭を見て、地面から皆のためのエントリのOpenCVを書きますどのようなソフトウェア、そして知りません基本的には、OpenCVのを学ぶ方法を知っています。

:実際にOpenCVのは、視覚処理に関連するライブラリである、プロセスを学習ライブラリの束が、実際にライブラリであることを時間、C言語の数学を学び、使用する時間である
ライブラリがやっている理解1.
ライブラリを学ぶ2.どのようにそれはいくつかの機能が付属して使用する必要があり、そしてどのような影響これらの機能の
いくつかの複雑な機能を実現するために、これらの機能を組み合わせることにより、いくつかの機能を学習した後、3。

この記事は話していることを強調Windowsの上でC ++の構文次のコースは、Python、C ++構文はない話している、OpenCVの。

そして、OpenCVのを開発するどのようなソフトウェアについて話す、一般的な構成が必要なインストールパッケージのリンクの下に取り付けた研究へのVS設定OpenCVのライブラリを使用することです。
VS2019の抽出コード:5162
OpenCVの-4.1.0に抽出コード:n7lz
に注意を払う文法OpenCVのは、そこに2-3の初めからの変更、で、今4にアップデート。3見つかった移動が上与えられた場合ので、移植可能なコードで、OpenCVのは、所与の時間に変更し、異なるバージョンが存在してもよい、構文2、実質的に同じであり、3は、いくつかの関数のパラメータのいくつかの違いを有する4その上に関数のパラメータ。

4つのステップのインストール時:
VS2019交換してください。1.
2.インストールOpenCVのライブラリ
環境変数に3. OpenCVのライブラリを
4ビルドVSでプロジェクトを、OpenCVの上のライブラリに接続されているプロジェクト
の具体的な手順は、私達与えるために私は、リンク(やや面倒なステップ、私は自分自身を書きません......)と、それを毎回使用するために使用VS2019設定OpenCVのチュートリアル

それは始め、私たちは次の5つの内容について話しているので、いくつかの比較的単純な関数であるだけでなく、非常に興味深いです。
1.画像表示
2階調画像
3.不鮮明な画像
4.エッジ検出
5.保存写真

先に進む前に、私たちは私の例では、新しいプロジェクトに画像を配置する必要があり、私の新しいプロジェクトがあるOpencvTest1、私はこのプロジェクトのmain.cppにパスを見つけ、置くbilibili.jpgをこの場所へ。
ここに画像を挿入説明
1.ショーの写真

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
 Mat src = imread("bilibili.jpg");
 
 imshow("lalala",src);
 
 waitKey(0);
 return 0;
}

効果:小さな黒い箱の出現と絵。
ここに画像を挿入説明
ここでは、このコードの内容を説明することができます。

#include <opencv2/opencv.hpp>  
#include <iostream> 
这两句话是分别引入opencv的库和c++的标准库
using namespace std;
using namespace cv;
这两句是引入工作空间,std是c++标准库的工作空间名,cv是opencv的工作空间名。
(工作空间的目的是避免 如果两个库有相同的函数名,在调用函数时发生冲突,
 上文这两个库里没有重复的函数名,所以直接引入工作空间不会有影响。)
int main()
{
 Mat src = imread("bilibili.jpg");
 
 imshow("lalala",src);
 
 waitKey(0);
 return 0;
}

//这一段是主函数。
Mat src = imread("bilibili.jpg");//其实是两条语句合在一起。分别为:
Mat src;//定义一个Mat类型的变量,变量名是src
src = imread("bilibili.jpg");//调用imread函数读取图片并把这张图片赋值给src。

imshow("lalala",src);//调用函数imshow展示图片,第一个参数lalala是显示图片所用的窗口的名字,src是上面刚刚被一张图片赋值的变量。

waitkey(0);//显示图片后开始等待下一步操作。如果不加这条命令的话,自己屏幕上会有一个黑框一闪而过,
//图片也不会显示出来,因为程序没有停下来,显示图片后直接关闭了程序。

return 0;//程序结束的标志,C语言上常用。因为这个主函数的返回值类型是int,所以最后返回一个0让程序结束。

シンプルなOpenCVのプログラムが書かれたこの方法では、彼の役割は、画像を呼び出して表示することです。
PS:
使用する1. 関数imreadは、()画像がファイルmain.cppには、あなたが直接、画像を読み取る画像の名前を入力することができ、フォルダ内にある場合、時間の関数を読み込みます。
もちろん、我々はまた、画像を読み取るために、絶対パスの画像を入力することができます。関数imread( "D:\\ \\対 OpencvTest1 \\ OpencvTest1 \\ bilibili.jpg")
なお、 Iは、別のパスを使用する場合、 "\\"の代わりに"\"、C / C ++構文に従ってため、唯一の「\」を書き込むため、「\」効果ができず、パス間で分離する「\\」の使用だから、エスケープ文字として処理することができます。
もちろんそうではない「\\」、そして、あなたが使用することができます/のような、分離:関数imread:(「D /vs/OpencvTest1/OpencvTest1/bilibili.jpg」)
2. 関数imshow()最初の引数はウィンドウの名前です
ここに画像を挿入説明

2.画像階調
従来の方法でディスプレイのグレースケール画像は二つある:第一読取階調画像フォーマット時間で読み取ることです。第二は、画像に読み込まれ、その後、画像を変換することです。
最初の方法:

#include <opencv2/opencv.hpp>  
#include <iostream> 
using namespace std;
using namespace cv;
int main()
{
 Mat src = imread("bilibili.jpg",0);
 
 imshow("lalala",src);
 
 waitKey(0);
 return 0;
}
//可以发现其实和第一次的代码区别不大,只是修改了一下imread的参数
 Mat src = imread("bilibili.jpg",0);
 //imread()函数有两个参数,第一个参数是图片的路径或图片的名字,第二个参数是以何种格式来读取图片。
 //默认值是1,也就是原本的格式读取;如果输入参数为0的话就是以黑白格式读取。

効果:

ここに画像を挿入説明
第二の方法:
呼び出しcvtColor()関数

#include <opencv2/opencv.hpp>  
#include <iostream> 
using namespace std;
using namespace cv;
int main()
{
 Mat src = imread("bilibili.jpg");
 Mat dst;
 cvtColor(src,dst,COLOR_BGR2GRAY);
 imshow("lalala",dst);
 
 waitKey(0);
 return 0;
}
//我们的操作是新建了一个Mat对象dst,又调用了函数cvtColor()来进行图片的灰度化,最终显示的图片也变成了dst。
 cvtColor(src,dst,COLOR_BGR2GRAY);//第一个参数是输入图像,第二个参数是输出图像,第三个参数是进行何种转换。
 //BGR2GRAY的意思是图片由BGR(三原色)格式变为灰度图格式。

効果:ここに画像を挿入説明
3ファジー画像
浸食、拡張、フィルタリング:プレゼンテーションの時間は、画像をぼやけて、我々は最初の3つの形態学的操作を導入しなければなりません。
腐食:むしばむ()絵の境界点を削除します。
拡張:拡張するための画像の国境にDILATE()。
膨張および腐食レンダリングを、以下、これら二つの動作は正反対であり、それらは、組み合わせ組成物缶開放動作及び閉鎖動作、トップキャップ、ブラックハット形態学的処理の一連の動作しました。

#include <opencv2/opencv.hpp>  
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
 Mat src = imread("bilibili.jpg");
 imshow("src", src);
 Mat dst1,dst2;
 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
 erode(src, dst1, element);
 imshow("erode",dst1);
 dilate(src, dst2, element);
 imshow("dilate", dst2);
 
 waitKey(0);
 return 0;
}

効果:ここに画像を挿入説明
フィルター:フィルタリングはノイズ除去のために使用され、外部からの干渉は、画像がぼやけて、フィルタの使用は、画像をより明白特徴作ることができるように、画像の特徴の一部をマスクすることができます。(PS:特性は必ずしも画像が鮮明に見える反映していない、より明白です。)

フィルタリング絵話す原理をいくつか前の話に事前の知識(計画の焦点を、それがここでは重要です)。
まず、我々は以前に絵を受け入れることができ、変数を定義し、それがタイプでマットが、これは実際にあるマトリックス型変数。実際には、画像は、我々は、実際には、画像の画素値が100 * 100で見るような大きな行列は、この画像は100×100の大行列、一色のうちに混合される3つの原色の行列の各値であること、です、各画像によってピクセル画像の色を調整するために、よりカラフルように。(あなたはその低ピクセルの画像を見つけることができれば、我々はそれがほとんど異なる色があまりにも小さな箱、実際には、これらの小さな正方形のピクセルであることがわかります。)
それは言った、我々はについて話すことができ、フィルタリングの原則であります何を、私たちは絵を取得し、それが大きな行列を取得することと同じです。まず、大きなマトリックス行うパーティションのような25の小さな4×4の行列に分割される100×100の大きなマトリックスとして、。いわゆる画像機能は、実際に行列の固有値は、我々はより多くの明白な画像特徴をしたい、画像の画素値は、より多くの機能となっ期待されています。私たちは、それぞれにできるので、小さなマトリックス4つの* 4つのなど値行列の固有値発見した後、これらの数字、加重平均値の中央値を探しているとして、いくつかの動作値、交換は、私たちの写真特徴付けられます機能は一層明白です。

私たちは、最も一般的なの一つ与える平均のフィルタリング:例を
私たちは平均値フィルタすべき大きな行列の必要性を持っている場合は、私たちが最初に小さな3×3行列を見つけているの二乗値のほとんど真ん中、実際には、それを操作しますすべての値の二乗平均。
以降(75 + 193 + 37 + 121 + 80 + 189 + 45 + 94 + 232)/ 118 = 9、我々中間値80すなわち118に:

75 193 37
121 80 189
45 94 232

への変更

75 193 37
121 118 189
45 94 232

このフィルタリング原則終わりには、我々は結果を見て始めました。

#include <opencv2/opencv.hpp>  
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
 Mat src = imread("bilibili.jpg");
 imshow("src", src);
 Mat dst;
 blur(src, dst, Size(7, 7));
 imshow("blur", dst);
 
 waitKey(0);
 return 0;
}

blur(src, dst, Size(7, 7));//1.输入图像,2.输出图像,
//3.进行滤波时选择小矩阵的大小(注意要要是n*n的矩阵,且n为奇数)。

効果:ここに画像を挿入説明
4エッジ検出
エッジ検出は、実際に画像のエッジで発見されますが、シャープなエッジをしたい場合は、多くの楽しみでは、限り、エッジ検出は、まずグレースケール画像であるとして、あなたは検出前にフィルタリングステップを追加することができます。

関数の引数は非常に理解していない場合は、パラメータの値を変更することができ、変更の効果を確認、あなたが知っている場所では、このパラメータの影響。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
 Mat src = imread("bilibili.jpg");
 imshow("src", src);
 Mat dst;
 cvtColor(src, src, COLOR_BGR2GRAY);
 blur(src, src, Size(3, 3));
 Canny(src, dst, 3, 9, 3);
 imshow("canny", dst);
 waitKey(0);
 return 0;
}
//流程:读图,灰度化,滤波,边缘检测。
 Canny(src, dst, 3, 9, 3);//1.输入2.输出3.最小阈值4.最大阈值5.sobel算子的大小
 //最大最小阈值用来使在阈值范围内的像素值才能保留。sobel算子的用处是与原图进行卷积运算,得到一个新的图,这个图根据阈值范围留下数据后就是效果图。

効果:
ここに画像を挿入説明
5.保存画像
ただ一つの関数関数imwriteでは、()を実現することができます。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
 Mat src = imread("bilibili.jpg");
 imshow("src", src);
 Mat dst;
 cvtColor(src, src, COLOR_BGR2GRAY);
 blur(src, src, Size(3, 3));
 Canny(src, dst, 3, 9, 3);
 imshow("canny", dst);
 imwrite("canny.jpg",dst);
 waitKey(0);
 return 0;
}
//和上一个代码相比只加了一个函数imwrite("canny.jpg",dst);
imwrite("canny.jpg",dst);//第一个参数是图片名,记得加后缀。这里也可以写绝对路径。第二个参数是保存哪张照片,这里选择边缘检测之后的图片。

私たちは、どこより「canny.jpg」よりmain.cppにフォルダを見つけました。ここに画像を挿入説明
これは多くのことを読んだの量の第32条でkeil5との話に見られるような記事は、次のSTM32は、軽水上のチュートリアルを書き終えます。
それは書き込み良いに時間がかかるため次の再発は、おそらく一日おきに、また仕事のMoを完了する必要があり......

リリース5元の記事 ウォンの賞賛3 ビュー726

おすすめ

転載: blog.csdn.net/qq_43690756/article/details/105130236