OpenCVの画像のエッジ検出と画像保存
OpenCVの画像のエッジ検出処理と画像保存
//
//画像ファイルのエッジ検出と保存
//
// Copyright(c) 2012 shiotani.cn All Rights Reserved.
//
//前準備
//1.ファイル>新規作成>プロジェクト>VisualC++>Win32コンソールアプリケーション
//2.プロジェクト>プロパティ>構成プロパティ>全般>文字セット>設定なし
//3.プロジェクト>プロパティ>構成プロパティ>C/C++>全般>追加のインクルードディレクトリ>C:\OpenCV2.3\include
//
//VC++フォルダ内にimg1.jpg画像ファイルを設置する
//
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_core231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_imgproc231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_highgui231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_calib3d231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_contrib231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_features2d231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_flann231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_gpu231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_legacy231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_ml231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_objdetect231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_ts231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_video231d.lib")
int _tmain(int argc, _TCHAR* argv[])
{
char* wnd_name_in ="Input Image"; // 表示Window識別名の宣言
char* wnd_name_out="Output Image"; // 表示Window識別名の宣言
IplImage* img_in=cvLoadImage("img1.jpg",0); // 入力画像構造体宣言&グレースケールで画像読込み
// IplImage* img_in=cvLoadImage("img1.jpg",CV_LOAD_IMAGE_GRAYSCALE); //cvLoadImage("img1.jpg",0);と同意
IplImage* img_out; // 出力画像構造体宣言
if(img_in==NULL) // 画像ファイルがない時
{
printf("There is NOT the image file.\n");
cvWaitKey(0); // キー入力待ち
return -1;
}
cvNamedWindow(wnd_name_in, 0); // 表示Window作成
cvResizeWindow(wnd_name_out, 500, 800); // 表示Windowサイズ変更
cvNamedWindow(wnd_name_out, 0); // 表示Window作成
cvResizeWindow(wnd_name_out, 500, 800); // 表示Windowサイズ変更
img_out=cvCreateImage(cvSize(img_in->width,img_in->height),IPL_DEPTH_8U,1); // 出力画像確保
cvCanny(img_in,img_out,40,120);
// エッジ検出Canny
CvFont font;
// Canny閾値表示
cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 0, 0.2, CV_AA);
cvPutText(img_out, "cvCanny(img_in, img_out, 40, 120);", cvPoint(180,20), &font,CV_RGB(255,0,255));
cvShowImage(wnd_name_in, img_in); // 入力画像表示
cvShowImage(wnd_name_out, img_out); // 出力画像表示
cvSaveImage("img1_out.jpg", img_out); // 出力画像JPG保存
cvWaitKey(0);
// キー入力待ち
cvDestroyWindow(wnd_name_in); // 表示Windowを破棄
cvReleaseImage(&img_in); // 画像構造体の解放
cvReleaseImage(&img_out); // 画像構造体の解放
return 0;
}
入力画像(大阪城)
入力画像ファイル「img1.jpg」(500px×800px)は、プログラムフォルダ内に設置します。
実行結果の画像表示
Cannyエッジ検出関数で閾値40,120の場合です。
cvCannyの閾値変化による出力画像変化
Cannyエッジ検出の閾値を変えた場合の出力画像変化をみてみました。
cvLoadImageのチャネルフラグ
cvLoadImageのチャネルフラグ | 値 | 意味 |
CV_LOAD_IMAGE_GRAYSCALE | 0 | グレースケール(8ビット1チャネル) |
CV_LOAD_IMAGE_COLOR | 1 | カラー(8ビット3チャネル) |
CV_LOAD_IMAGE_ANYDEPTH |
2 | グレースケール(任意のビット深度1チャネル) |
CV_LOAD_IMAGE_ANYCOLOR |
4 | 8ビットカラーまたはグレースケール |
cvCreateImage(cvSize(img_in->width,img_in->height),IPL_DEPTH_8U,1)で、グレースケールなのでIPL_DEPTH_8Uとチャネル1を指定し、カラーならIPL_DEPTH_8Uとチャネル3を指定します。
ピクセル深度
ピクセル深度 | 意味 |
IPL_DEPTH_8U | 符号なし8ビット整数 |
IPL_DEPTH_8S |
符号あり8ビット整数 |
IPL_DEPTH_16U |
符号なし16ビット整数 |
IPL_DEPTH_16S |
符号あり16ビット整数 |
IPL_DEPTH_32S | 符号あり32ビット整数 |
IPL_DEPTH_32F | 単精度浮動小数点 |
IPL_DEPTH_64F | 倍精度浮動小数点 |