忍者ブログ
ADMIN / ENTRY
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
新刊カレンダー
ブログ内検索
プロフィール
HN:
Nina.A
性別:
男性
趣味:
麻雀、ラノベ、漫画
自己紹介:
MJ4や天鳳等でよく麻雀やってます。もし会ったらよろしくです。
ブログは単なるメモ帳となる予定。
C/C++勉強中の大学生雑記
<<  2024/03  >>
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 
[9]  [8]  [7]  [6]  [5]  [4]  [3]  [2]  [1
2024/03/19  12:26:03
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2008/11/06  16:55:01

複数の画像(0.png、1.png、…)を読み込み、そのうちの一枚と他の画像の形状を比較するプログラムを練習用に作ってみた。練習用なのでエラーチェックが適当かもです。

#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <vector>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int main(int argc, char* argv[])
{
    int i;

    // 画像の読み込み枚数を指定
    std::cout << "Enter the number of image.\n";
    std::cin >> i;

    const int num(i);

    std::vector<IplImage*> img(num);

    {
        // 画像読み込み
        std::stringstream ssm;
        std::string fname;
        for(i = 0; i < num; ++i){
            ssm << "C:\\Users\\UserName\\Desktop\\IMG\\" << i << ".png";
            fname = ssm.str();
            img[i] = cvLoadImage(fname.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
            if( !img[i] ){
                std::cerr << "Failed : " << fname << std::endl;
                exit(EXIT_FAILURE);
            }
            std::cout << "Loaded : " << fname << std::endl;
            ssm.str("");
        }
    }

    // 比較元とする画像を指定
    do{
        std::cout << "Enter the image number of origin.\n";
        std::cin >> i;
    }while( ( i < 0 || num <= i ) && ( puts("The number exceeds the range.") || true ) );

    const int origin(i);

    // cvMatchShapes関数を利用して形状を比較する
    double* result = new double[num];
    for(i = 0; i < num; ++i){
        result[i] = cvMatchShapes( img[origin], img[i], CV_CONTOURS_MATCH_I1);
    }

    // 結果を表示
    for(i = 0; i < num; ++i){
        std::cout << "I(" << i << "," << origin << ") = " << result[i] << std::endl;
    }

    // ベストマッチを探す
    int minIdx = static_cast<int>(0 == origin);
    double minResult = result[minIdx];
    for( i = 0; i < num; ++i){
        if( i == origin ) continue;
        if( result[i] < minResult ){
            minResult = result[i];
            minIdx = i;
        }
    }
    std::cout << "Min : Image No." << minIdx << std::endl;

    // ウィンドウを開く
    cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Best", CV_WINDOW_AUTOSIZE);

    // 画像表示
    cvShowImage("Original", img[origin]);
    cvShowImage("Best", img[minIdx]);

    cvWaitKey();

    // 破棄
    cvDestroyAllWindows();
    delete [] result;
    for(i = 0; i < num; ++i){
        cvReleaseImage( &img[i] );
    }
    return 0;
}
PR
この記事にコメントする
お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Powerd by NINJAブログ / Designed by SUSH
Copyright © メモ帳ブログ All Rights Reserved.
忍者ブログ [PR]