安全なSTL listの要素削除ループ

Posted on Sun 15 November 2009 in C++

erase(itr)を呼び出すとitrは使えなくなるので、
erase()の返り値で次の要素のイテレータを受け取りループを続行する。

list<int>::iterator itr = SampleList.begin();
for (; itr != SampleList.end(); ) {
  if( 条件 ) {
    itr = SampleList.erase( itr );
    continue;
  }
  it++;
}

プロセッサ数を求めるコード

Posted on Sat 14 November 2009 in Windows

GetSystemInfoでシステムの情報をSYSTEM_INFO構造体に取得すると、dwNumberOfProcessorsにプロセッサ数が入る。

SYSTEM_INFO si;
GetSystemInfo(&si);
si.dwNumberOfProcessors; //プロセッサ数

参考URL

http://msdn.microsoft.com/ja-jp/library/cc429808.aspx


トーンカーブ

Posted on Sun 27 September 2009 in ペイントツール • Tagged with ペイントツール

3次スプラインを利用してトーンカーブを実装してみた。
f:id:hiroki0:20090927071914j:image


画面の大きさを取得するWinAPI メモ

Posted on Wed 23 September 2009 in Windows

メイン画面の大きさを取得

int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);

マルチディスプレイ環境で全ての画面領域の大きさを取得

int width = ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
int height = ::GetSystemMetrics(SM_CYVIRTUALSCREEN);

参考URL

http://msdn.microsoft.com/ja-jp/library/cc429812.aspx


OpenCVで3次スプライン補間

Posted on Mon 21 September 2009 in OpenCV

OpenCVの連立1次方程式を解くcvSolveを利用して3次のスプライン補間を行うコード。

コード

#include <stdio.h>
#include <string.h>
#include <cv.h>
#include <highgui.h>
void SetPixelToBGR(IplImage *image, int x, int y, int b, int g, int r)
{
  assert(image->nChannels == 3);
  if(!image) return;
  if(( 0 <= x && x <= image->width -1 )&& (0 <= y && y <= image->height -1 ) )
  {
    b …

Continue reading

SSE用いたアルファブレンドの高速化

Posted on Mon 14 September 2009 in ペイントツール

計測するアルファブレンド処理

  • SSEを使わない処理
  • 16バイトアライメントなし、SSEを使って1pixelごとに処理
  • 16バイトアライメントなし、SSEを使って2pixelごとに処理

計測方法

  • 1920x1200BGR画像を2枚読み込み、アルファ値を指定してアルファブレンドを行う。
  • 画像の保存、読み込みはopenCVを用いた。
  • アルファブレンド部分の処理のみ処理時間を計測した。
  • 処理時間の計測は以下のページにあるコードを使用した。

http://74.125.155.132/search?q=cache:lBJiOP0zi6MJ:clippingcutting.blogspot.com/2007_10_01_archive.html+QPCTimer+QueryPerformanceFrequency&cd=1&hl=ja&ct=clnk&gl=jp

計測に使用した環境


Continue reading

インラインアセンブラでデバッグ時にレジスタの値を表示させる。

Posted on Sun 13 September 2009 in Windows

Visual Studioレジスタの値を表示させる。

デバッグ中に[デバッグ]→[ウィンドウ]→[レジスタ]で
レジスタウィンドウを開く。

SSEのレジスタなどが表示されていない場合は、レジスタウィンドウを
右クリックして、表示したいアイテムをクリックする。

参考URL

http://msdn.microsoft.com/ja-jp/library/aa290860%28VS.71%29.aspx


CPUID命令を使用して、SSEに対応しているか調べるコード

Posted on Sat 12 September 2009 in Windows

VC++のインラインアセンブラからCPUID命令を使用してSSEに対応しているか調べるコードを書きました。

CPUID命令

EAXレジスタに値を入れてCPUID命令を呼び出すと、
各レジスタにCPUの情報が格納されます。

  • EAX=0 ベンダIDの取得
  • EAX=1 プロセッサ情報とプロセッサの機能
  • EAX=2 キャッシュとTLBディスクリプタ情報
  • EAX=3 プロッセッサ・シリアル・ナンバ
  • EAX=80000000h サポートする最大拡張機能番号の取得
  • EAX=80000001h 拡張プロセッサ情報とプロセッサの機能
  • EAX=80000002h,80000003h,80000004h プロセッサブランド文字列
  • EAX=80000006h 拡張L2キャッシュ情報
  • EAX=80000008h 仮想アドレスと物理アドレスのサイズ

今回はSSEに対応しているか調べたいのでEAXには、1を入れてCPUID命令を呼び出します。

http://www.sandpile.org/ia32/cpuid …


Continue reading

Makefileメモ

Posted on Wed 02 September 2009 in Makefile

Makefailを分割

makeでデフォルトで実行されるのはMakefile
ファイルを指定して実行するのには

 make -f Makefile.hoge hoge

とすればいい。

ディレクトリの移動

Makefile中で

  hoge:
(cd hoge; make -f Makefile.hoge hoge)

の様にすれば()のなかだけhogeに移動して()の外に出ると元のディレクトリに自動で戻る。


ファイル検索関数サンプル

Posted on Tue 01 September 2009 in Windows

ディレクトリを指定してファイルを検索するWinAPIサンプル

HANDLE hFind;
WIN32_FIND_DATA fd;
char fpath[_MAX_PATH];
wsprintf(fpath, "hogehoge\\*.txt"); //txtファイルを検索
hFind = ::FindFirstFile(fpath, &fd);
if(hFind == INVALID_HANDLE_VALUE){//検索失敗
  ....
}
do{
  //ここでfd.cFileNameに検索結果のファイル名が入る。
  //ファイル名だけなので注意する。
}while(::FindNextFile(hFind, &fd));
::FindClose(hFind);