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

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

2008/11/10  22:12:57

買ったのはBUFFALOのBWC130H01。

ソフマップで4280円だったんだけど、ソフマップカード新規入会でその場で1000円引き出来るというので、もちろん入会しました。まあ、VISAカード持ってなかったのでいいかな、と。おかけで予想以上に手こずって講義に遅れかけましたが。

製品の方はドライバ周りで少し手こずったけど無事完了。OpenCVでの動作も確認。ということで、1つプログラムを書いてみようかな。

PR
2008/11/10  00:43:29

前のエントリで関数ポインタを少し理解したので、続いてメンバ関数ポインタについて少し学ぶ。

参考:C++編(言語解説) 第34章 メンバ関数ポインタExtrernal Link

今回もとりあえず例を挙げておく。

class vec{
public:
    void resize(int);
};

int main(void){
    vec v;
    vec *w = new vec();
    void (vec::*func)() = &vec::resize;

    (v.*func)(5);
    (w->*func)(5);

    return 0;
}

メンバ関数ポインタの宣言は、

   void   (    vec     ::*   func   )(        );
【返却値】(【クラス名】::*【変数名】)(【引数】);

メンバ関数のアドレス取得は、

&    vec     ::  resize
&【クラス名】::【関数名】
で可能。メンバ関数のアドレス取得は&が必須なので、関数アドレス取得時には常につける癖をつけた方がよさそう。各変数固有のアドレス(上の例ではvec::vのresize関数)を取得するわけではないみたい。

ポインタを介した関数の実行は、

vec v;
(v.*func)(5);
vec* w = new vec;
(w->*func)(5);
の様に、.*演算子か->演算子を用いる。

ちなみに、メンバ関数が静的(static)である場合には、呼び出しは普通の関数の様に呼び出せる。

2008/11/09  15:32:31

関数ポインタを使う必要が出てきた。OpenCVのcvSetMouseCallback関数とかで存在自体は知ってたけど、使うのは初めてなのでメモっておく。

参考:C++言語解説Extrernal Link

以下に簡単な関数ポインタのプログラム例を挙げておく。

#include <iostream>

void func1(void){
  std::cout << "func1\n";
}

void func2(void){
  std::cout << "func2\n";
}

int main(void){
  int i;

  void (*func)(void);
  while(1){
    std::cout << "1:func1 2:func2 0:quit\n";
    std::cin >> i;
    switch(i){
      case 1:
        func = &func1;
        break;
      case 2:
        func = func2;
        break;
      default:
        goto LOOP_EXIT;
    }
    func();
  }
  
LOOP_EXIT:
  return 0;
}

これを見ると分かるように関数ポインタの宣言は、

     void        (*   func   )(     void     );
【関数の戻り値】 (*【変数名】)(【関数の引数】);
という形になる。

関数アドレスの取得は、

&func1
&【関数名】
または単に、
func2
【関数名】
で取得可能。

関数ポインタを介した関数の実行は、

(*      func      )(        );
(*【関数ポインタ】)(【引数】);
で実行可能。また、普通の関数のように、
      func      (        );
【関数ポインタ】(【引数】);
としても実行できる。

2008/11/08  00:05:32

いつものパソコン以外のvimだと設定がされてなかったりするのでここに置いておく。

" vi非互換モード
set nocompatible
" 構文ハイライトをon
syntax on
" 行数表示
set number
" コマンド部の高さ指定
set cmdheight=1
" タブを4字に
" タブ8字の場合ts=8 sw=4 sts=4
set ts=4 sw=4 sts=0
" Tabを表示
set listchars=tab:>\ 
" 行数表示の色指定
set highlight=n:NONE
set list
" 全角スペースの可視化
if has("syntax")
  syntax on
  function! ActivateInvisibleIndicator()
    syntax match InvisibleJISX0208Space " " display containedin=ALL
    highlight InvisibleJISX0208Space term=underline ctermbg=Gray guibg=Gray
  endf
  augroup invisible
    autocmd! invisible
    autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
  augroup END
endif
"
" 補完機能制御
set wildmode=list:full
set wildmenu
" バッファ切り替え後もundo保持
set hidden
" AutoIndent
set autoindent
" ソフトタブ無効(タブ有効)
set noexpandtab
" 改行コードの自動認識
set fileformats=unix,dos,mac
" ステータスラインを常に表示
set laststatus=2
" ステータスラインに文字コードと改行文字を表示する
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P"
" BSの対応
set backspace=2
"
"
" 文字コードの自動認識
if &encoding !=# 'utf-8'
  set encoding=japan
  set fileencoding=japan
endif
if has('iconv')
  let s:enc_euc = 'euc-jp'
  let s:enc_jis = 'iso-2022-jp'
  " iconvがeucJP-msに対応しているかをチェック
  if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'eucjp-ms'
    let s:enc_jis = 'iso-2022-jp-3'
  " iconvがJISX0213に対応しているかをチェック
  elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'euc-jisx0213'
    let s:enc_jis = 'iso-2022-jp-3'
  endif
  " fileencodingsを構築
  if &encoding ==# 'utf-8'
    let s:fileencodings_default = &fileencodings
    let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
    let &fileencodings = &fileencodings .','. s:fileencodings_default
    unlet s:fileencodings_default
  else
    let &fileencodings = &fileencodings .','. s:enc_jis
    set fileencodings+=utf-8,ucs-2le,ucs-2
    if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
      set fileencodings+=cp932
      set fileencodings-=euc-jp
      set fileencodings-=euc-jisx0213
      set fileencodings-=eucjp-ms
      let &encoding = s:enc_euc
      let &fileencoding = s:enc_euc
    else
      let &fileencodings = &fileencodings .','. s:enc_euc
    endif
  endif
  " 定数を処分
  unlet s:enc_euc
  unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
  function! AU_ReCheck_FENC()
    if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
      let &fileencoding=&encoding
    endif
  endfunction
  autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" □とか○の文字があってもカーソル位置がずれないようにする
set ambiwidth=double
" if exists('&ambiwidth')
" set ambiwidth=double
" endif

参考:ずんWiki - vimExtrernal Link

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;
}					
Powerd by NINJAブログ / Designed by SUSH
Copyright © メモ帳ブログ All Rights Reserved.
忍者ブログ [PR]