OpenCV 检测 sheet 张纸
OpenCV Detecting a sheet of paper
我是 OpenCV 的新手所以任何人都可以帮助更好地给出 here 的答案 understanding.I 我无法得到下面的 "angle" 和 "square"代码
if (approx.size() == 4 &&
fabs(contourArea(Mat(approx))) > 1000 &&
isContourConvex(Mat(approx)))
{
double maxCosine = 0;
for (int j = 2; j < 5; j++)
{
CGFloat angle;
double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
maxCosine = MAX(maxCosine, cosine);
}
if (maxCosine < 0.3)
squares.push_back(approx);
}
角度是问题顶部的函数。它需要 3 个点和 returns 一个角度值。
看起来正方形是某种向量数据结构。我的 C++ 生锈了,所以我无法在不做更多研究的情况下解析该类型声明(而且我还没有喝足够的咖啡。)
昨晚处理了我的问题,在这里得到了答案
std::vector<std::vector<cv::Point> > squares;
double angle( cv::Point pt1, cv::Point pt2, cv::Point pt0 ) {
double dx1 = pt1.x - pt0.x;
double dy1 = pt1.y - pt0.y;
double dx2 = pt2.x - pt0.x;
double dy2 = pt2.y - pt0.y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}
我是 OpenCV 的新手所以任何人都可以帮助更好地给出 here 的答案 understanding.I 我无法得到下面的 "angle" 和 "square"代码
if (approx.size() == 4 &&
fabs(contourArea(Mat(approx))) > 1000 &&
isContourConvex(Mat(approx)))
{
double maxCosine = 0;
for (int j = 2; j < 5; j++)
{
CGFloat angle;
double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
maxCosine = MAX(maxCosine, cosine);
}
if (maxCosine < 0.3)
squares.push_back(approx);
}
角度是问题顶部的函数。它需要 3 个点和 returns 一个角度值。
看起来正方形是某种向量数据结构。我的 C++ 生锈了,所以我无法在不做更多研究的情况下解析该类型声明(而且我还没有喝足够的咖啡。)
昨晚处理了我的问题,在这里得到了答案
std::vector<std::vector<cv::Point> > squares;
double angle( cv::Point pt1, cv::Point pt2, cv::Point pt0 ) {
double dx1 = pt1.x - pt0.x;
double dy1 = pt1.y - pt0.y;
double dx2 = pt2.x - pt0.x;
double dy2 = pt2.y - pt0.y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}