请查看以下代码
#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网络摄像头的默认网络摄像头测试了这个。两个结果都是一样的。
如果这是代码的问题,我该如何解决?
我的下一个目标是背景扣除,我觉得这些不需要的东西可能会让我失望。请帮忙。
答案 0 :(得分:2)
你有threshold1 == 0。如果将其设置为10,并将blur sigma设置为4,则大多数虚假线将消失。 (至少他们为我做了)。
使用我的网络摄像头,这些设置可获得合理的输出:
cv::GaussianBlur(image,blur,Size(0,0), 4);
cv::Canny(blur,canny,25,30,3);
然而,检测到的线路仍然有点嘈杂。
编辑:以下情况没有帮助:您可以做的另一件事是平均连续两帧,这会将噪音降低到70%。
(或购买更好的相机)
答案 1 :(得分: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