学习OpenCV2 C++ API(3)
2013-03-09 23:17 robturtle 阅读(614) 评论(0) 编辑 收藏 举报今天的内容有:
- pyrDown 缩放图像(exp 02-05, P28)
- Canny 边缘检测 (exp 02-06, P29)
- VideoCapture 视频流读取 (exp 02-08, P31)
pyrDown 缩放图像(exp 02-05, P28)
函数原型:
void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT)
参数:
- src -- 输入图像
- dst -- 输出图像;具有特定的尺寸及和源图像相同的类型
- dstsizeze -- 输出图像的尺寸,默认的尺寸为:Size((src.cols+1)/2, (src.rows+1)/2),输出图像的尺寸必须满足:
|dstsize.width * 2 - src.cols| <= 2
|dstsize.height * 2 - src.rows| <= 2
总而言之,函数把图像宽和高名缩小一半,size只会影响舍入的问题而已。至于 bordertype 边界类型,也是指示最外面的边的从属问题。
函数的名字来源其进行模糊运算使用的 Gaussian pyramid 结构。
示例:
// PyrDown.cpp -- Blur an image and downsample it using Gaussian pyramid construction #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <string> using std::string; // NOTE: require Image file "lena.jpg" int main(int argc, char *argv[]) { cv::Mat src = cv::imread("lena.jpg"), dst; cv::pyrDown(src, dst); string winName("0205 - pyrDown - source"); cv::namedWindow(winName); cv::imshow(winName, src); winName = "0205 - pyrDown - destination"; cv::namedWindow(winName); cv::imshow(winName, dst); cv::waitKey(0); }
Canny 边缘检测 (exp 02-06, P29)
函数原型:
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )
可以发现大部分 OpenCV 图像算法的前两个参数都是输入/输出图像,输入和输出可以相同,后不赘述。
参数:
- threshold1 -- 阈值下限;
- threshold2 -- 阈值上限; 用于寻找初始最强边界点。
- apertureSize -- sobel 操作中的光圈大小;
- L2gradient -- 当为真时,使用标准公式计算梯度(含开方运算);为假时只计算近似值。
根据 Canny 的算法步骤,首先将彩色图像转化为黑白,使用高斯模糊,最后再使用Canny 算法,示例如下:
// Canny.cpp -- canny edges detection algorithm #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <string> using std::string; int main(int argc, char *argv[]) { cv::Mat src = cv::imread("lena.jpg"), dst; cv::cvtColor(src, dst, CV_RGB2GRAY); cv::GaussianBlur(dst, dst, /* kernel size = */ cv::Size(0,0), /* Sigma X = */ 3, /* Sigma Y = */ 3); cv::Canny(dst, dst, 0, 30); string winName("0206 - Canny"); cv::namedWindow(winName); cv::imshow(winName, dst); cv::waitKey(0); }
VideoCapture 视频流读取 (exp 02-08, P31)
这个在《学习OpenCV2 C++ API(1)》就介绍过了,只说明一点,使用 cv::VideoCapture(0) 构造函数将打开默认摄像头。其他详细用法等需要时再介绍。
介绍性的第二章过了,下一次将进入正题,开始讨论 OpenCV 的基本数据结构,不过可能只会侧重和2D图像处理相关的。