TA的每日心情 | 难过 2017-4-18 09:57 |
---|
签到天数: 7 天 连续签到: 1 天 [LV.3]偶尔看看II
|
系列阅读:https://jingyan.eeboard.com/category/53
openCV首先将我参考的案例放在这里https://derekmolloy.ie/beaglebone/beaglebone-video-... 东西确实做得好,多学习学习总没有坏处。
先确认下本篇需要的库环境 一个是openCV版本
另外查看下摄像头支持的格式,了解V4L2驱动的情况:
1. 首先下载derekmolloy分享在Git 上的代码boneCV 软件包
git clone git://github.com/derekmolloy/bone ,下图是boneCV 软件包的详细内容
再把boneCV 源代码贴出来 分析一下,包含了摄像头截图,并作边沿检测的功能,Canny 算子的目标是找到一个最优的边缘检测算法。
#include<iostream>
#include<opencv2/opencv.hpp>
usingnamespacestd;
usingnamespacecv;
intmain()
{
VideoCapture capture(0); //打开视频文件:建立一个VideoCapture结构,或者可以手动载入图片
//Mat srcImage = imread("/Users/YWY/Pictures/house.jpg");
capture.set(CV_CAP_PROP_FRAME_WIDTH,1024); //设置图片分辨率
capture.set(CV_CAP_PROP_FRAME_HEIGHT,768);
if(!capture.isOpened()){ //检测是否正常打开:成功打开时,isOpened返回ture
cout<<"Failed to connect to the camera."<<endl;
}
Mat frame,edges;
capture>>frame;
if(frame.empty()){
cout<<"Failed to capture an image"<<endl;
return-1;
}
cvtColor(frame,edges,CV_BGR2GRAY); 、/转换为灰度图,参数CV_BGR2GRAY则是OpenCV2中的用法中的用法
// blur( grayImage, edge, Size(3,3) ); //或可调用Blur 模糊化
Canny(edges,edges,0,30,3); //运行Canny算子,3为threshold1,9为threshold2
imwrite("edges.png",edges);
imwrite("capture.png",frame);
return0;
}
顺便了解下Canny函数,如下摘自其它博文
void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )
- 第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
- 第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和类型。
- 第三个参数,double类型的threshold1,第一个滞后性阈值。
- 第四个参数,double类型的threshold2,第二个滞后性阈值。
- 第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
- 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。
边缘检测的一般步骤:边缘检测的一般步骤:
- 滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和。
- 增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。
- 检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
2. 执行编译
3. 运行,虽然有很多invalid argument 的信息,按derek视频的解释是这个小警告不影响结果的,只要没有报错或者timeout就都是可以产生边缘检测结果的。
4,结果 ,将图片通过sftp 传送到笔记本电脑的ubuntu上查看 ,对边缘检测并无太多研究,当作是一次试验吧,第一张边缘检测的直线部分还是清晰可见的。如果各位看官有任何改进建议可随时跟贴留言。多谢了。
来一张小图示意下。
|
|