OpenCV メモ
せっとあっぷ
- http://sourceforge.net/projects/opencvlibrary/ からDLし、c:/ に展開する
→ c:/opencv が作成される
- インクルードパスに C:/opencv/build/include を追加する
ソースには #include <opencv2/opencv.hpp> を記述する
- ライブラリパスに C:/opencv/build/x86/vc10/lib を追加(x86, VS2010 の場合)
- リンクライブラリに以下を追加
- /opencv/build/x86/vc10/lib/opencv_xxx.lib
- ライブラリは opencv_core245.lib の様に openCV バージョン番号を含んでいるので、
バージョンを変えた場合はリンクするもののファイル名を設定し直す必要がある
- たいていは以下のものをリンクしておけばおk
- opencv_core245d.lib;opencv_highgui245d.lib;opencv_imgproc245d.lib;opencv_objdetect245d.lib;
- opencv_core245.lib;opencv_highgui245.lib;opencv_imgproc245.lib;opencv_objdetect245.lib;
- 実行するには opencv_xxx.dll が必要
- /opencv/build/x86/vc10/bin にパスを通すか、dll たちをパスの通ったディレクトリにコピー
Qt で結果表示
- OpenCV の画像は cv::Mat 等で保持される
- cv::Mat src = cv::imread(fileName.toAscii().data()); で画像読込出来る
- QImage img(src.data, src.cols, src.rows, QImage::Format_RGB888); でQImage に変換可能
- ただし、RGB順序が逆なので、以下のどちらかの方法で順序を入れ替える
- cv::cvtColor(src, dst, CV_RGB2BGR);
- img = img.rgbSwapped();
- 画面に表示するには、QPixmap::fromImage() で QPixmap に変換したのち、
QLabel::setPixmap() 等で表示
- QPixmap → cv::Mat 変換:
QImage t_img = m_img->pixmap()->toImage().convertToFormat(QImage::Format_RGB888);
t_img = t_img.rgbSwapped(); // cv::Mat は RGB ではなく BGR の順
cv::Mat color_image(t_img.height(), t_img.width(), CV_8UC3, t_img.bits());
円検出
- グレイスケール変換
- cv::cvtColor(m_src_img, gray_img, CV_BGR2GRAY);
- 平坦化
- cv::GaussianBlur(gray_img, gray_img, cv::Size(sz,sz), sigma, sigma);
- ハフ変換(円検出)
- 内部で Canny エッジ検出処理が行われ、ついでハフ変換が行われる
- 第6引数はそのパラメータ
std::vector<cv::Vec3f> circles;
cv::HoughCircles(gray_img, circles, CV_HOUGH_GRADIENT, 1, 100,
m_param1->value(), // param1 Canny() エッジ検出器に渡される2つの閾値の大きい方
m_param2->value(), // param2 円の中心を検出する際の投票数の閾値
m_minR->value(), // 最小半径
m_maxR->value()); // 最大半径
int sz = circles.size();
- 結果参照
- 結果は引数で渡した std::vector<cv::Vec3f> コンテナに格納される
- (*itr)[0], (*itr)[1] に中心座標、(*itr)[2] に半径が格納されている