工場ラインの文字読み取りユースケース

ここでは、OpenVINOを実際に使用したユースケースを想定し、プログラムを作成してみます

工場内のラインでよくあるケースは商品に貼られたり、印刷されるシールの日付や文字の読み取りです
単純な文字認識だと、OpenVINOに含まれるText Detection C++ Demoによって文字認識が行えます
そのため同じ場所に印字されるものであれば文字読み取りの位置決めなどは必要なくなるのですが、円形の商品(缶のようなもの)であれば、日付データの角度を意識しないといけません
これらを想定してユースケースを考えます

上記が日付データのサンプルとします
左右についている黒丸、白丸は角度補正用のアライメントマークとなります
プログラムの流れとしては、それぞれのアライメントマークを入力画像から探し、2点間の角度を求め、入力画像の角度補正を行います
ではまずアライメントマークを入力画像から探す方法を考えましょう

アライメントマークの検出

日付データの印刷が比較的自由な場合は、日付の両端にアライメントマークが付けられることがあります
これは角度補正が必要になる対象物(ワークと言う)がある場合、角度に関わらないマークを印刷しておくことによって、そのマークを画像上で検出し、画像を角度補正します

今回の場合は、白丸、黒丸の二つをアライメントマークとして使用し、これらを検出することにより角度を検出します

アライメントマークの検出には

アライメントマークの検出には、正規化相関(パターンマッチング)と言う比較的オーソドックスな画像処理を使います
正規化相関は高速で同じサイズ・角度の対象物を画像上から検出することが得意なアルゴリズムです
この正規化相関はOpenVINOにも含まれるOpenCVにAPIがあるのでそれを使用します

BlackMark
WhiteMark
//アライメントマークの読み込み
white_img = imread("/home/upsquared/WhiteMark.png", cv::IMREAD_COLOR);
//アライメントマークの色変換
cv::cvtColor( white_img, white_img, cv::COLOR_BGR2GRAY );

//アライメントマークの読み込み
black_img = imread("/home/upsquared/BlackMark.png", cv::IMREAD_COLOR);
//アライメントマークの色変換
cv::cvtColor( black_img, black_img, cv::COLOR_BGR2GRAY ); 

//入力画像の色変換
cv::cvtColor( image, image, cv::COLOR_BGR2GRAY );

//テンプレートマッチング
cv::matchTemplate(image, white_img, matching_res, CV_TM_CCOEFF_NORMED);
cv::minMaxLoc( matching_res, NULL, &maxVal, NULL, &white_max_pt);

//テンプレートマッチング
cv::matchTemplate(image, black_img, matching_res, CV_TM_CCOEFF_NORMED);
cv::minMaxLoc( matching_res, NULL, &maxVal, NULL, &black_max_pt); 

上記のプログラムがアライメントマークを検出する部分となります
アライメントマークが検出されれば角度補正となります

角度補正

アライメントマークが検出された後は、二点間の角度を使用して、画像を変換します

二点から角度を計算するには

atan2(y2-y1,x2-x1)*180/M_PI, 1.0); 

を計算すれば回転角が計算できます

この回転角から画像を補正するためにはOpenCVのアフィン変換ライブラリを使用します

cv::Mat mat = cv::getRotationMatrix2D(ctr, atan2(y2-y1,x2-x1)*180/M_PI, 1.0);
cv::warpAffine(image, temp_image, mat, image.size(), CV_INTER_LINEAR, cv::BORDER_TRANSPARENT); 

回転角の計算と補正を行っているのが上記のプログラムとなります

対象画像を切り出す

対象物の位置、角度を検出し、画像の補正ができれば、次は対象となる画像を切り出します
この作業は対象画像を小さくし、高速化のために必要です

cv::getRectSubPix(temp_image, cv::Size(300, 100), ctr, output_image);
cv::cvtColor( output_image, output_image, cv::COLOR_GRAY2BGR );

現状、画像サイズは300x100pxとしてありますが、これは対象画像登録時に設定しても良いですし、アライメントマークの距離から自動的に抜き出しても構いません

cv::getRectSubPix関数内の引数はそれぞれ画像ファイル、サイズ、中心位置、出力画像となります
中心位置はcv::Point2dで指定しています

OpenVINOに含まれるtext detection demoはRGB画像で無いと処理できないため、cv::cvtColorで色変換を行っています

Text detection C++ demoとつなぐ

ここまできたらText detection C++ demoの画像ファイル入力部分を探して、つなぎ合わせるとリアルタイムの文字認識ソフトが出来ます

上記の動画は実際に日付データを回転させて文字認識を行っています

続く…