2011年12月1日木曜日

Ruby/SDL のインストール

RubyForge から rubysdl-win32-bin: rubysdl-2.1.1.1-mswin32-1.9.1-p243.zip をダウンロードDLL とかもひと通り入っている
展開して
> ruby install_rubysdl.rb


2011年11月29日火曜日

OpenCV の cv::subtract 関数で詰まったこと

一方を Scalar にすることはできるが、 Scalar_<float> にすることはできない。
type が一致しないエラーになる。
with OpenCV 2.3.1, Visual C++ 2010 Express, Windows XP

例:
//Scalar_<float> ave;
Scalar ave;
std::vector<float> data;
std::vector<float> sub;
ave = cv::mean(data);
cv::subtract(data, ave, sub); // ave が Scalar_<float> だとエラー

2011年11月8日火曜日

OpenCV 2.3.1 superpack を VC++ 2010 Express で使用する

C:\opencv にインストールしたとする。
path に入れておく
  • C:\opencv\build\x86\vc10\bin;
  • C:\opencv\build\common\tbb\ia32\vc10;
tbb_debug.dll を入手する。build\common\tbb\ia32\vc10 にコピーする。http://threadingbuildingblocks.org/file.php?fid=77

Visual C++ で使用する設定。
プロジェクトのプロパティ
  • 全般
    • 文字セット: マルチバイト文字セットを使用する(OpenCV は wchar に対応していないため)
  • VC++ ディレクトリ
    • インクルードディレクトリ: C:\opencv\build\include
    • ライブラリディレクトリ: C:\opencv\build\x86\vc10\lib
リンクプラグマ
/* OpenCV 2.3.1 */
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

#ifdef _DEBUG
#pragma comment(lib,"opencv_core231d.lib")
#pragma comment(lib,"opencv_imgproc231d.lib")
#pragma comment(lib,"opencv_highgui231d.lib")
#else
#pragma comment(lib,"opencv_core231.lib")
#pragma comment(lib,"opencv_imgproc231.lib")
#pragma comment(lib,"opencv_highgui231.lib")
#endif

2011年11月4日金曜日

Point と Mat の相互変換

cv::Vec を使う
Vec は, Matx の特別なケースと言えます. Matx は行列を表現しますが, Vec はベクトルを1行の行列として表現します.
Vec<T,2> と Point_ は相互に変換可能で, Vec<T,3> と Point3_ も同様です.また, Vec<T,4> は CvScalar やScalar に変換することができます. Vec の要素にアクセスするには, operator[] を利用します.
OpenCV2.1からOpenCV2.2の変更点(ChangeLog)
固定型,固定サイズの行列に対する cv::Matx 型が追加されました.現在の Vec は,Matx から派生します.このクラスは,cv::Mat を使うとオーバヘッドが大きすぎるような,極小さい行列に対して利用されます.Matx と Mat は相互変換が可能です. 

Point → Mat
Vec<T, int cn> :  public Matx<T, cn, 1> であるから、Point_<T, cn> は Matx<T, cn, 1> に変換できる。
Mat(Matx) で Mat に変換する。

Mat → Point
今のところ Mat_<T>::(r, c) を使って、 Point(Mat_<T>(0,0), Mat_<T>(1,0)) しかわからない。

2011年9月26日月曜日

MFC の SendMessage

class CHogeDoc : CDocument で、
void CHogeDoc::changed() {
 ...(処理)...
 UpdateAllViews(NULL);
}
が別のスレッドから呼び出されると、CHandleMap が参照できず Assertion failed する。
UpdateAllViews を SendMessage を使って呼び出したいのだが、どうすればいいのか?

CWnd::SendMessage を使うのがいい。
CHogeView にメッセージを登録して、そこから update させる。回りくどい。
ユーザー定義メッセージは手動で登録する。
#define WM_USER_ONCHANGED (WM_USER + 1)

Header:
class CHogeView {
 ...
 afx_msg LRESULT onChanged(WPARAM wParam, LPARAM lParam);
}

Source:
IMPLEMENT_DYNCREATE(CHogeView, CView)

BEGIN_MESSAGE_MAP(CHogeView, CView)
 ON_MESSAGE(WM_USER_ONCHANGED, &CHogeView::onChanged) // ON_COMMAND ではない
END_MESSAGE_MAP()

...

LRESULT CHogeView::onChanged(WPARAM wParam, LPARAM lParam) {
 InvalidateRect(NULL);
}

2011年9月21日水曜日

Net::HTTP の accept-encoding を指定する。

https://luna.easyjp.net/projects/memo/wiki/ruby/net_http-gzip
Net::HTTP.start(uri.host, uri.port){|http|
  opts = {
    "Accept-Encoding" => "gzip",  # これによりサーバへgzipを要求する
    "User-Agent" => "Ruby/Downloader"
  }

  response = http.get(uri.request_uri, opts)
  unless response.is_a?(Net::HTTPOK)
    raise "response error!, #{response.code}"
  end

  if response["Content-Encoding"] == "gzip"
    StringIO.open(response.body, 'rb'){|f|
      content =  Zlib::GzipReader.wrap(f).read
    }
    use_gzip = true
  else
    content = response.body
  end
}

コモンダイアログのカスタマイズ

VC++テクニック : コモンダイアログのカスタマイズ

2011年9月7日水曜日