我想学习OpenCV并将其用于我的一个项目中的车牌检测系统。我一直在遵循以下步骤:
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
而且还要做其他事情。关于如何绕过这个并计算距离的任何想法?
答案 0 :(得分:2)
PossibleChar
不是cv::Point
。这是一个包含可能字符的信息的类,让我们称之为 blob :
std::vector<cv::Point> contour;
blob的轮廓cv::Rect boundingRect;
blob的边界框(轴对齐)int intCenterX; int intCenterY;
bounding box
double dblDiagonalSize; double dblAspectRatio;
bounding box
正如您所看到的,它不是Point
,而是包含有关给定blob的形状和范围的信息,可能是字符
功能:
double distanceBetweenChars(const PossibleChar &firstChar, const PossibleChar &secondChar)
给出两个可能字符的中心之间的欧氏距离。
如果您想使用cv::Point
,可以执行以下操作:
double distanceBetweenChars(const cv::Point &firstChar, const cv::Point &secondChar) {
return cv::norm(firstChar - secondChar);
}
返回两点之间的欧氏距离,如前所述。
如果您想将PossibleChar
描述为cv::Point
(这可能对您的管道有用),您可以考虑该中心的坐标:
cv::Point getPointFromPossibleChar(const PossibleChar& pc) {
return cv::Point(pc.intCenterX, pc.intCenterY);
}
答案 1 :(得分:0)
在我看来,他们计算两个角色之间距离的方式并不理想。
虽然我认为你不应该将cv::Point
与PossibleChar
混在一起。它们是不同的东西,PossibleChar
有更多的信息。成为其中一部分的是cv::Point
,它描述了PossibleChar
的质心。
如果您有两个cv:Point
,则可以通过以下方式计算距离:
cv::Point a(1, 3);
cv::Point b(5, 6);
double res = cv::norm(a-b);//Euclidian distance
如果您决定使用该课程,我认为您应该更改
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)));
}
到
double distanceBetweenChars(const PossibleChar &firstChar, const PossibleChar &secondChar) {
cv::Point a(firstChar.intCenterX,firstChar.intCenterY);
cv::Point b(secondChar.intCenterX,secondChar.intCenterY);
return(cv::norm(a-b));
}