OpenGL de プログラミング - エッジ検出2
現在地
>>
メニュー
>>
サンプルコード::OpenCV
>>
エッジ検出
>> エッジ検出2
問題
以下の画像をグレイスケールで読み込んで、ソーベルフィルタをかけよ。
その他条件:
出力のスケール変換は関数を「cvConvert関数」を用いる。
cvConvertScaleAbs()、cvConvertScale()の結果を比べる。
画像
答え
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
int main( int argc, char **argv)
{
IplImage *imgA = cvLoadImage( "test3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
std::exit(0);
}
IplImage *tmp = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_16S,1);
/* 絶対値 ver.*/
cvSobel (imgA, tmp, 0, 1);
cvConvertScaleAbs(tmp, imgA);
cvNamedWindow("abs convert",CV_WINDOW_AUTOSIZE);
cvShowImage("abs convert",imgA);
/* 通常 ver.*/
cvConvertScale(tmp, imgA);
cvNamedWindow("nomal convert",CV_WINDOW_AUTOSIZE);
cvShowImage("nomal convert",imgA);
cvReleaseImage(&tmp);
cvReleaseImage( &imgA );
cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvDestroyWindow("window");
return 0;
}
メモ
「エッジ検出」は、「Sobel」、「Laplacian」、「Canny」の3種類ある。
このうち、処理の都合上、
「Sobel」、「Laplacian」は「IPL_DEPTH_16S」(符号付16ビット整数)
の「tmp変数(IplImage)」が必要。
データの「16ビット表現」から「8ビット表現」への「スケール変換」は、
「cvConvert関数」を用いる。
http://opencv.jp/opencv/document/opencvref_cxcore_...
スケール変換について
「cvConvertScale()関数」
任意の線形変換によって配列の値を変換する。
つまり、
変換によって「表現できない値」になる場合には,
表現できる「最も近い実軸上の値」で表現する。
「cvConvertScaleAbs()関数」
こちらは、「8ビット符号無し整数型の配列」に変換する。
つまり、
「グレースケール」の「IPL_DEPTH_8U」にあわせて表現してくれる。
⇒出力結果ではこちらのほうがより正しいはず...