OpenCVを学び、プロジェクトの1つでナンバープレート検出システムに使用したいと思っています。私は概説されたステップに従ってきました:
https://github.com/MicrocontrollersAndMore/OpenCV_3_License_Plate_Recognition_Cpp
問題は、クラスが存在PossibleChar.h
することです。これが使用しているデータ型について頭を悩ませているようには見えません。ガイドラインに準拠していないため、アルゴリズム内でクラスを使用したくありませんが、シーン内のナンバープレートを検出するためのアルゴリズムを実行する必要があります。クラスは次のようになります。
// PossibleChar.h
#ifndef POSSIBLE_CHAR_H
#define POSSIBLE_CHAR_H
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
class PossibleChar {
public:
// member variables
std::vector<cv::Point> contour;
cv::Rect boundingRect;
int intCenterX;
int intCenterY;
double dblDiagonalSize;
double dblAspectRatio;
static bool sortCharsLeftToRight(const PossibleChar &pcLeft, const PossibleChar & pcRight) {
return(pcLeft.intCenterX < pcRight.intCenterX);
}
bool operator == (const PossibleChar& otherPossibleChar) const {
if (this->contour == otherPossibleChar.contour) return true;
else return false;
}
bool operator != (const PossibleChar& otherPossibleChar) const {
if (this->contour != otherPossibleChar.contour) return true;
else return false;
}
// function prototypes
PossibleChar(std::vector<cv::Point> _contour);
};
#endif // POSSIBLE_CHAR_H
PossibleChar.cpp
PossibleChar::PossibleChar(std::vector<cv::Point> _contour) {
contour = _contour;
boundingRect = cv::boundingRect(contour);
intCenterX = (boundingRect.x + boundingRect.x + boundingRect.width) / 2;
intCenterY = (boundingRect.y + boundingRect.y + boundingRect.height) / 2;
dblDiagonalSize = sqrt(pow(boundingRect.width, 2) + pow(boundingRect.height, 2));
dblAspectRatio = (float)boundingRect.width / (float)boundingRect.height;
}
私の最初の考えは、このクラスが行っているのは私cv::Point
に与えることだけだということでした。これは、ナンバープレートの「キャラクター」間の距離の計算に移るまではうまくいきました。これは、アルゴリズムで指定された関数です。
double distanceBetweenChars(const PossibleChar &firstChar, const PossibleChar &secondChar) {
int intX = abs(firstChar.intCenterX - secondChar.intCenterX);
int intY = abs(firstChar.intCenterY - secondChar.intCenterY);
return(sqrt(pow(intX, 2) + pow(intY, 2)));
}
使用せずに使用した場合PossibleChar
:
double distanceBetweenChars(const cv::Point &firstChar, const cv::Point &secondChar) {
cv::Rect boundingRect;
boundingRect = cv::boundingRect(firstChar);
}
エラーが発生し続けます:
error: no viable conversion from 'const cv::Point' (aka 'const Point_<int>') to 'const cv::_InputArray'
したがって、このクラスは単に返すだけでなく、cv::point
何か他のことをしていると私は信じるようになります。どうすればこれを回避して距離を計算できるかについてのアイデアはありますか?
APossibleChar
はではありませんcv::Point
。これは、可能な文字の情報を含むクラスです。これをblobと呼びましょう。
std::vector<cv::Point> contour;
ブロブの輪郭cv::Rect boundingRect;
ブロブのバウンディングボックス(軸揃え)int intCenterX; int intCenterY;
の中心の座標 bounding box
double dblDiagonalSize; double dblAspectRatio;
サイズとアスペクト比 bounding box
ご覧のとおり、これはではありませんが、特定のブロブの形状と範囲Point
に関する情報が含まれています。これは文字である可能性があります。
関数:
double distanceBetweenChars(const PossibleChar &firstChar, const PossibleChar &secondChar)
2つの可能な文字の中心間のユークリッド距離を示します。で作業したい場合はcv::Point
、次のことができます。
double distanceBetweenChars(const cv::Point &firstChar, const cv::Point &secondChar) {
return cv::norm(firstChar - secondChar);
}
これは、前と同じように、2点間のユークリッド距離を返します。
を(パイプラインで役立つ場合があります)PossibleChar
として記述したい場合cv::Point
は、中心の座標を考慮することができます。
cv::Point getPointFromPossibleChar(const PossibleChar& pc) {
return cv::Point(pc.intCenterX, pc.intCenterY);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加