カレンダー
12 | 2025/01 | 02 |
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 |
最新記事
(01/30)
(01/18)
(12/16)
(12/12)
(11/25)
(11/25)
(11/24)
(11/24)
(11/22)
(11/17)
最新コメント
[12/25 日没]
[11/15 無色大師]
[11/12 無色大師]
[11/11 無色大師]
[11/08 無色大師]
リンク
新刊カレンダー
ブログ内検索
プロフィール
HN:
Nina.A
性別:
男性
趣味:
麻雀、ラノベ、漫画
自己紹介:
MJ4や天鳳等でよく麻雀やってます。もし会ったらよろしくです。
ブログは単なるメモ帳となる予定。
ブログは単なるメモ帳となる予定。
カウンタ
C/C++勉強中の大学生雑記
2025/01/31
06:15:40
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
この記事にコメントする