OpenCV de Asobu


OpenCVで文字認識してみましたーほぼできました。

久しぶりにOpenCV使ったのでメモ。

1. 導入

VisualStudioの設定

・追加のインクルードディレクトリ
../opencv/build/include

・追加のライブラリディレクトリ
(Win32) ../opencv/build/x86/vc12/lib
(x64) ../opencv/build/x64/vc12/lib

・ビルド後イベント
(Win32) xcopy /Y “..\opencv\build\x86\vc12\bin\*.dll” “$(TargetDir)”
(x64) xcopy /Y “..\opencv\build\x64\vc12\bin\*.dll” “$(TargetDir)”

・ライブラリを追加

#ifdef _DEBUG
#pragma comment(lib, "opencv_core248d.lib")
#pragma comment(lib, "opencv_highgui248d.lib")
#pragma comment(lib, "opencv_imgproc248d.lib")
#else
#pragma comment(lib, "opencv_core248.lib")
#pragma comment(lib, "opencv_highgui248.lib")
#pragma comment(lib, "opencv_imgproc248.lib")
#endif

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

2. API

・ファイル読み書き
cv::Mat cv::imread(filename);
bool cv::imwrite(filename, image);

・クローン
cv::Mat image.clone();

・二値化
cv::threshold(src, dst, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

・輪郭抽出
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_NONE);

・バウンディングボックス取得
cv::Rect cv::boundingRect(std::vector<cv::Point> contour);

・アフィン変換
float angle = 0.0f, scale = 1.0f;
cv::Point2f center(0, 0);
const cv::Mat matrix = cv::getRotationMatrix2D(center, angle, scale);
cv::Mat dst;
cv::warpAffine(src, dst, matrix, src.size());

・テンプレートマッチ
cv::Mat result;
cv::matchTemplate(src, tmp, result, CV_TM_CCOEFF_NORMED);
cv::Point max_pt;
double max_val;
cv::minMaxLoc(result, NULL, &max_val, NULL, &max_pt);