C ++ / Opencv了解正在使用的数据类型

时间:2017-02-01 08:47:55

标签: c++ algorithm opencv

我想学习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而且还要做其他事情。关于如何绕过这个并计算距离的任何想法?

2 个答案:

答案 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::PointPossibleChar混在一起。它们是不同的东西,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));
}