【问题标题】:Perfomance Issues while capturing and processing a video捕获和处理视频时的性能问题
【发布时间】:2016-06-27 15:31:38
【问题描述】:

我目前正在处理一个需要显示处理后的实时视频捕获的项目。因此,我正在使用类似的东西:

cv::VideoCapture cap(0); 
if (!cap.isOpened()) 
    return -1;

cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

cv::namedWindow("Current Capture");
for (;;)
{
    cv::Mat frame;
    cap >> frame;       
    cv::Mat mirrored;
    cv::flip(frame, mirrored, 1);
    cv::imshow("Current Capture", process_image(mirrored));

    if (cv::waitKey(30) >= 0) break;
}

我遇到的问题是,process_image 在图像中执行圆形检测需要一些时间才能完成并导致显示更像是幻灯片而不是视频。

我的问题是:如何在操纵process_image 函数的情况下加快处理速度?

我想过在另一个线程中执行图像处理,但我不确定如何开始。除了这个,你还有什么想法吗?

PS.:我不指望你为我写代码,我只需要一个点开始;)

编辑:

好的,如果捕获时我对性能无能为力,我将需要更改 process_image 函数。

cv::Mat process_image(cv::Mat img)
{
    cv::Mat hsv;
    cv::medianBlur(img, img, 7);
    cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);

    cv::Mat lower_hue_range; // lower and upper hue range  in case of red color
    cv::Mat upper_hue_range;
    cv::inRange(hsv, cv::Scalar(LOWER_HUE1, 100, 100), cv::Scalar(UPPER_HUE1, 255, 255), lower_hue_range);
    cv::inRange(hsv, cv::Scalar(LOWER_HUE2, 100, 100), cv::Scalar(UPPER_HUE1, 255, 255), upper_hue_range);

    /// Combine the above two images
    cv::Mat hue_image;
    cv::addWeighted(lower_hue_range, 1.0, upper_hue_range, 1.0, 0.0, hue_image);

    /// Reduce the noise so we avoid false circle detection
    cv::GaussianBlur(hue_image, hue_image, cv::Size(13, 13), 2, 2);

    /// store all found circles here
    std::vector<cv::Vec3f> circles;
    cv::HoughCircles(hue_image, circles, CV_HOUGH_GRADIENT, 1, hue_image.rows / 8, 100, 20, 0, 0);

    for (size_t i = 0; i < circles.size(); i++)
    {
        /// circle center
        cv::circle(hsv, cv::Point(circles[i][0], circles[i][1]), 3, cv::Scalar(0, 255, 0), -1, 8, 0);
        /// circle outline
        cv::circle(hsv, cv::Point(circles[i][0], circles[i][1]), circles[i][2], cv::Scalar(0, 0, 255), 3, 8, 0);
    }

    cv::Mat newI;
    cv::cvtColor(hsv, newI, cv::COLOR_HSV2BGR);

    return newI;
}

是否存在我可以解决的重大性能问题?

【问题讨论】:

  • 1ms 很短,遇到性能问题也就不足为奇了。
  • 哦,对不起,这只是我尝试过的。我最初用 30 毫秒尝试过。编辑了问题。

标签: c++ opencv video-capture


【解决方案1】:

如果您确定 process_image 函数是导致程序瓶颈的原因,但您无法修改它,那么您可以做的事情并不多。如果该功能的执行时间比视频帧的持续时间长,那么您将永远无法获得所需的内容。

降低视频捕获的质量或减小尺寸如何?目前我可以看到您已将其设置为 1280*720。如果 process_image 函数可以处理的数据较少,它应该执行得更快。

【讨论】:

  • 嗯。好的,这实际上是我的想法……降低分辨率是可行的,但是,它也会降低最终的质量。我将尝试访问process_image 的代码。也许可以优化一下。
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2013-07-26
  • 2010-11-13
  • 1970-01-01
  • 2015-01-09
  • 2021-06-11
  • 1970-01-01
  • 2020-05-16
相关资源
最近更新 更多