并行计算光流矢量的交点

时间:2018-12-19 11:00:52

标签: opencv parallel-processing intersection opticalflow

根据如何看待,我面临着一个简单而不是那么简单的问题。为了避免因我英语不好造成的误会,我快速绘制了图纸以解释这种情况:

problem visualized

我对图片中的虚线矢量感兴趣,这些矢量中的潜在交点在图片中标记为绿色,如果在此方向上继续发生移动,则为。 有趣的区域iv在屏幕底部的两个圆圈之间标记为蓝色,因此,我对所有交点落在底部的两个蓝色点之间的所有矢量感兴趣。在屏幕上与其他边界区域相交的每个其他矢量对我来说都不是有趣的,因此我没有考虑这些时间。 我有一个正在运行的代码,该代码正在运行,但是速度很慢,因此无法使用。 简而言之,我只是从密集的光流中得到2个点,计算由这2个点定义的线的斜率,然后将线方程(y = m * x + b)设置为零,然后在交点之后求解b。这是在函数

中发生的

这是我要优化的代码示例。

cv::Ptr<cv::DenseOpticalFlow> STD_OF = cv::optflow::createOptFlow_SparseToDense();

void processDOF(                     bool&blnFirstFrame,// bool标志,从视频Feed的第二帧开始为假                     cv :: Mat&mask,//具有与Graysclae图像相同大小的蒙版                                                         //其中有以太0或255标记图像中我感兴趣的窗口                     int iThreshold,// 255个过滤器                     cv :: Mat&mPreviousGrayscaleImageForOpticalFlow,//以前的灰度图像                     cv :: Mat&mGrayscaleImageForOpticalFlow,//当前灰度图像                     cv :: Mat&mDenseOpticalFlowImage //存储光流数据的图像                 ){     cv :: Mat cflowmap; //绘制显示光流的图像     cv :: UMat umDenseOpticalFlowImage; //存储光流数据的图像     cv :: Point pIntersection; //蓝色区域内的交点     int step = 5; //在图像的x和y方向上每5个点观察光流

//calculate dense optical flow
if  (
        ( blnFirstFrame == false ) &&
        ( mPreviousGrayscaleImageForOpticalFlow.empty() == false ) &&
        ( mGrayscaleImageForOpticalFlow.empty() == false )              //current grayscale image
){

    STD_OF->calc    (
                        mPreviousGrayscaleImageForOpticalFlow,
                        mGrayscaleImageForOpticalFlow,
                        umDenseOpticalFlowImage
                    );
    umDenseOpticalFlowImage.copyTo(mDenseOpticalFlowImage);
    mGrayscaleImageForOpticalFlow.copyTo(cflowmap);

    //calculate intersections
    for(int y = 0; y < cflowmap.rows; y += step)
            for(int x = 0; x < cflowmap.cols; x += step)
            {
                if (mask.at<int>(y, x) >= iThreshold){          //check if the observed poit is within the mask

                    const cv::Point2f& offset = mDenseOpticalFlowImage.at<cv::Point2f>(y, x);   //offset where the point of the,
                                                                                                //optical flow vector is pointing to
                    //calculate intersection point
                    pIntersection = calculate_intersection  (
                                                cv::Point(x,y),                     //start point of observed optical flow vector
                                                cv::Point(cvRound(x+offset.x), cvRound(y+offset.y)),    //endpoint of observed optical flow vector
                                                getBorderPointLeft(),               //blue boder point left in the drawing
                                                getBorderPointright()               //blue boder point right in the drawing
                                            );
                    evaluationIntersectionPoint(pIntersection);     //put the point within a std::vector<cv::Point> for further evaluation
                    //draw the interesting vectors
                    cv::line(cflowmap, cv::Point(x,y), cv::Point(cvRound(x+offset.x), cvRound(y+offset.y)),
                         cv::Scalar(0,255,00));
                    cv::circle(cflowmap, cv::Point(x,y), 2, cv::Scalar(0,255,0), -1);
                }
            }
}

我的问题是我无法解决如何嵌套嵌套for循环中的零件:(。结果非常糟糕,我得到1FPS,目标是8-10FPS0

0 个答案:

没有答案