OpenCVの画像のエッジ検出と画像保存 C++プログラミング入門 しおたに・ドット・チャイナ

006.png

HOME > OpenCVの画像のエッジ検出と画像保存

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

入力画像ファイル「img1.jpg」(500px×800px)は、プログラムフォルダ内に設置します。

実行結果の画像表示
20110107Outimg.jpg

img1_out_40_120.jpg

 Cannyエッジ検出関数で閾値40,120の場合です。

cvCannyの閾値変化による出力画像変化
20120106img1_out.gif

 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 倍精度浮動小数点