OpenCV学習の旅2—エッジ検出技術


しばらく総括していないで、毎日何を忙しくしていることを知りません!ここ数日目の勉強を1時間かけてまとめてみましょう.
エッジ検出技術は画像解析の第一歩であり,主に画像の1次導関数の極値または2次導関数過零点点情報を用いてエッジを抽出する.
簡単に言えば、画像の階調変化の問題であり、一部の場所では画像の変化が遅いと、その1次導関数は小さくゼロになり、変化が激しい場所では大きくなる.本に書いてある勾配は、導数に相当し、自分の方向があるだけだ.2次導関数は、画素がエッジの明るい側にあるか暗い側にあるかを判断するために使用される.
このいくつかの言葉はエッジ検出の基本理論と方法を説明した.
 
具体的にOpenCVでどうやって実現するのか!主に画像と様々な演算子を用いてボリュームを実現する.ここで私はopenCVによって2つの陣営に分かれて実現します.
第一陣営:有函派:openCVに具体的な関数があるので、呼び出しさえすればいいです.これは簡単にできます.
主にsobel、Canny、Laplaceがあります.
 
cvSmooth(img_Elged_src,img_Elged_8u,CV_GAUSSIAN,3,0,0);
//cvShowImage("Elged",img_Elged_8u);
cvSobel(img_Elged_8u,img_Elged_16S,m_nSobelx,m_nSobely,m_nKernel);
//cvSobel(img_Elged_8u,img_Elged_16S,0,1,3);
cvConvertScaleAbs(img_Elged_16S,img_Elged_dest,1,0);
cvShowImage("Elged",img_Elged_dest);
 
cvSmooth(img_Elged_src,img_Elged_8u,CV_GAUSSIAN,3,0,0);
  cvCanny(img_Elged_8u,img_Elged_dest,m_nCanny1,m_nCanny2,m_nKernel);
  cvShowImage("Elged",img_Elged_dest);
 
cvSmooth(img_Elged_src,img_Elged_8u,CV_GAUSSIAN,3,0,0);
  cvLaplace(img_Elged_8u,img_Elged_16S,m_nKernel);
  cvConvertScaleAbs(img_Elged_16S,img_Elged_dest,1,0);
  cvShowImage("Elged",img_Elged_dest);

これらの関数を使用する場合、いくつか注意すべき点があります.
1.cvSobel、cvLaplace関数で要求されるdest画像はIPL_DEPTH_16S;
2.IPL_の使い方DEPTH_16 SをIPL_に変換DEPTH_8 U型に必要な関数はcvConvertScaleAbsです
3.kernel核は1,3,5,7でしか大きくないと間違いますが、現在はそうです.
第二陣営:無関数派;例えば、RobertPrewitKrishなどです.直接呼び出せる関数がないだけで,OpenCVでは実現できないわけではない.これらのアルゴリズムは実現できるだけでなく,上記の関数よりも柔軟に実現できる.ここで使用する関数は、次のとおりです.
cvFilter 2 D関数、これはボリュームを作る関数です.この関数がVisual C++のようなforサイクルを省くことができるからこそ実現できます.エッジ処理はボリューム化のプロセスです.では、どうやって実現できますか?
まず、自分のkernel、つまり通俗的なテンプレートを持っていなければなりません.この関数の具体的な形式は以下の通りである.
cvFilter2D(
const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1));
このテンプレートはCvmat*型でなければならないことがわかります.Cvmat型を作成するには、次の方法があります.
ポインタタイプ:
CvMat* Tempt3;
Tempt3=cvCreateMat(3,3,CV_32F);
float a[9]={-3,5,5,-3,0,5,-3,-3,-3};
cvInitMatHeader(Tempt3,3,3,CV_32F,a);

変数:
CvMat Tempt3;
Tempt3=cvCreateMat(3,3,CV_32F);
float a[9]={-3,5,5,-3,0,5,-3,-3,-3};
Tempt3=cvMat(3,3,CV_32F,a);

 
次にcvFilter 2 Dを呼び出して実現することができ,このテンプレートは主に配列によって先に定義される.
最後に注意しなければならない問題:
1.テンプレートCvMatは浮動小数点型でなければならない.CV_F 32などの形式;
2.配列aの定義も浮動小数点型でなければならない.
3.変数型を定義する場合は&Tempt 3を付けることを忘れないでください.