0

我正在处理以下代码:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
    VideoCapture *camera = new VideoCapture();

    camera->open(0);



    if(!camera->isOpened())
    {
        cout << "No Camera" << endl;
        return -1;
    }

    Mat image,blur,canny;

    namedWindow("Video");

    while(true)
    {
        *camera>>image;

        imshow("Video",image);

        cv::GaussianBlur(image,blur,Size(7,7),1.5,1.5);
        cv::Canny(blur,canny,0,30,3);

        imshow("cANNY",canny);

        if(waitKey(30)>=0)
        {

            break;
        }

    }


    return 0;
}

此代码生成以下 2 个输出

原来的:

在此处输入图像描述

精明:

在此处输入图像描述

正如你所看到的,canny 已经检测到很多甚至不存在的边缘。如果这是网络摄像头每秒帧数的问题,我应该使用哪种网络摄像头?每秒多少帧?我已经使用 DELL Inspiron 4030 中的默认网络摄像头和另一个 USB 2.0 网络摄像头对此进行了测试。两个结果是一样的。

如果这是代码的问题,我该如何解决?

我的下一个目标是背景减法,我觉得这些不需要的东西可能会让我失望。

4

2 回答 2

2

你有阈值1==0。如果将其设置为 10,并将模糊 sigma 设置为 4,则大多数虚假线将消失。(至少他们为我做)。

使用我的网络摄像头,这些设置可以获得合理的输出:

    cv::GaussianBlur(image,blur,Size(0,0), 4);
    cv::Canny(blur,canny,25,30,3);

然而,检测到的线路仍然有点嘈杂。

编辑:以下无济于事:您可以做的另一件事是平均两个连续帧,这会将噪声降低到 70%。

(或购买更好的相机)

于 2013-06-15T15:44:38.660 回答
1

您的低阈值应大于零:

int low_threshold = 10;//you can try with different values
cv::Canny(blur,canny,low_threshold,30,3);

您还可以使用一些相机参数,例如 saurtion 和对比度:

VideoCapture *camera = new VideoCapture();
camera->set(CV_CAP_PROP_CONTRAST,contrast_value);//between 0-1
camera->set(CV_CAP_PROP_SATURATION, saturation_value);//between 0-1
于 2013-06-15T15:49:21.850 回答