###前提・実現したいこと
現在、OpenCVとC++でDICひずみ計測システム(デジタル画像相関)を作っています。プログラミング初心者です。よろしくお願い致します。
まず、このシステムの原理ですが、変形する対象を画像からその変形量を求めるというものです。
CCDカメラから取り込まれた動画像におきまして、対象の負荷変形前後の画素の小集合(例えば30×30pixel)で比較、パターンマッチングしその小集合がどこに変位したかを画像全体でループ処理することで試験片の変形を計測するというものです。
今、行っているのは全画素に対して順番にアクセスし、アクセスした画素の周りで画素の集合(30×30pixelのサブセット)をテンプレートとしそれを画像全体にマッチング。マッチングが終わるとすぐとなりの画素にアクセスしサブセットを作ってテンプレートマッチング・・・を繰り返す部分です。
###発生している問題・エラーメッセージ
実行しますと、途中まではうまく作動しているようですがある段階から(0,0) score=1 がずっと出力されてしまいます。
###該当のソースコード
c++
include <iostream>
include <vector>
int main(int argc, char *argv[])
{
cv::Mat src_img = cv::imread("./lenna.png",CV_LOAD_IMAGE_GRAYSCALE);
if (!src_img.data) return -1;
cv::Mat result_img;
for( int y = 0 ; y < src_img.rows ; ++y ){
for( int x = 0 ; x < src_img.cols ; ++x ){
//unsigned char *p = &src_img.at<unsigned char>(y, 0);
cv::Size patch_sie(30, 30); //サブセットのサイズ cv::Point2f points( x, y); cv::Mat dst_img; cv::getRectSubPix(src_img, patch_sie, points, dst_img); // 矩形領域ピクセル値をサブピクセル精度で取得 cv::Mat result_img; cv::matchTemplate(src_img, dst_img, result_img, CV_TM_CCOEFF_NORMED); // テンプレートマッチング cv::Rect roi_rect(0, 0, dst_img.cols, dst_img.rows); // 最大のスコアの場所を探す cv::Point max_pt; double maxVal; cv::minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt); roi_rect.x = max_pt.x; roi_rect.y = max_pt.y; std::cout << "(" << max_pt.x << ", " << max_pt.y << "), score=" << maxVal << std::endl; // 探索結果の場所に矩形を描画 cv::rectangle(src_img, roi_rect, cv::Scalar(0, 0, 255), 3); ++x;
}
}
cv::namedWindow("search image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
cv::namedWindow("result image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
cv::imshow("search image", src_img);
cv::imshow("result image", result_img);
cv::waitKey(0);
}
###試したこと
各画素にはポインタでアクセスしますが、画像の端まで行った時にサブセットが画像からはみ出すことになるので不具合が起きているのかなとは思っていますが、何が原因かわかりません。そもそも、この方法でのアプローチが合っているのでしょうか。
長文乱文たいへん失礼いたしました。
よろしくお願いいたします。
###補足情報(言語/FW/ツール等のバージョンなど)
c++ VS2015 OpenCV3.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/28 06:14
2016/06/28 15:00