代码改变世界

学习OpenCV2 C++ API(3)

2013-03-09 23:17  robturtle  阅读(614)  评论(0编辑  收藏  举报

今天的内容有:

  1. pyrDown 缩放图像(exp 02-05, P28)
  2. Canny    边缘检测  (exp 02-06, P29)
  3. 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图像处理相关的。