如何查找我跟踪的对象球是否穿过我绘制的线?

时间:2017-04-04 18:40:23

标签: c++ opencv opencv3.0 opencv-contour

我正在使用c ++和OpenCV 3.0来创建SimulCam的基本形式。

我目前一直在寻找一种方法来检查对象球何时与我在输出窗口上绘制的线交叉/交叉。

使用轮廓跟踪球,最终我想计算出相交的确切帧数。

但首先,我想了解如何执行检查以查看对象球何时与绘制线交叉/交叉。

Scene with ball moving towards line

我有对象的轮廓,我想了解如何执行交叉点的检查。

查找轮廓和对象跟踪的代码:

findContours(resizedThresh, contourVector, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

contourVector.resize(contourVector.size());

line(resizedF_Fast, Point(300, 0), Point(300, 360), Scalar(255), 2, 8);
for (size_t i = 0; i < contourVector.size(); i++) {

     approxPolyDP(Mat(contourVector[i]), contourVector[i], 0.01*arcLength(contourVector[i], true), true);
     double area = contourArea(contourVector[i]);

     if (contourVector[i].size() > 5 && (area > 200)) {
        ++circlesC;
        drawContours(resizedF_Fast, contourVector, i, Scalar(255, 255, 255), 2, CV_AA, hierarchy, abs(1));
        searchForMovement(resizedThresh, resizedF_Fast);
     }
}

我做了一些其他研究,我一直在研究使用 lineIterator ,但我并不完全确定..

为潜在的原始代码道歉,新手在这里。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

我的第一种方法是将圆圈装入轮廓点,然后使用点积计算直线与圆心之间的距离。也许是这样的(没有尝试过):

Point Pc; // circle center
Point L0(300,0);
Point L1(300,360);

double v[] = {L1.x-L0.x,L1.y-L0.y};
double w[] = {Pc.x-L0.x,Pc.y-L0.y};

Mat v(1,2,CV_32F,v);
Mat w(1,2,CV_32F,w);

double c1 = w.dot(v);
double c2 = v.dot(v);  
double b = c1 / c2;

Mat Pb = L0 + b * v;
double distance = norm(Pc,Pb);

然后检查距离减去圆半径是否小于等于零。

但是由于你的相机的透视变换,球变成了椭圆,我的假设变得不那么准确了。

如果您需要更精确的解决方案,则需要检查每个轮廓点并采用最小距离。

This link显示了一些代码和进一步的解释。

答案 1 :(得分:0)

检查this教程。他展示了它是否检查一个物体(在他的情况下是汽车)是否穿过一条线。

答案 2 :(得分:0)

我终于解决了这个问题,我将在这里发布一般性想法。

对于每个帧,计算对象轮廓。

  • 每个轮廓将存储x和y坐标

使用 LineIterator (例如lineIt)循环显示一行的所有值。

if (xpos_contour < lineIt.pos().x) {
     // Object is on the left of the line
}
else if (xpos_contour > lineIt.pos().x) {
     // Object is to the right of the line
}

请记住使用自上而下拍摄的输入视频,因此只有x坐标才有意义。