《学习OpenCV 3(中文版)》 —简单的变换
简单的变换
很好,现在你已经可以用OpenCV来自己动手建立一个视频播放器了,这和现有的那些播放器差不多,但是我们的关注点在计算机视觉,所以希望做一些计算机视觉相关的工作。许多基础的计算机视觉工作都包括对视频流使用滤波器。我们将会对已有的程序进行修改以对视频中的每一帧实现一些简单的操作。
一个最简单的操作就是对图像的平滑处理,这将有通过高斯核或者其他核卷积效减小图像的信息量。OpenCV使得这样使用高斯核的卷积非常容易实现。如示例2-5所示,我们
注7: 因为HighGUI是一个轻量级的、易于使用的工具,所以cv::createTrackbar()不会区分滑动条的名称和真正显示在屏幕上的滑动条旁边的标签,你也许已经注意到 cv::namedWindow()也不区分窗口的名称以及真正在窗口上显示的名称。
可以新建一个名为"Example4-out"的窗口开始,并且在这个窗口显示处理结果。所以,在我们调用cv::imshow()在输入窗口并显示新获得的图像之后,我们就可以在output窗口计算并且显示处理结果。
示例2-5:加载图像并且在显示之前平滑处理图像
#include <opencv2/opencv.hpp> void example2_5( const cv::Mat & image ) {
// Create some windows to show the input // and output images in.
//
cv::namedWindow( "Example2_5-in", cv::WINDOW_AUTOSIZE ); cv::namedWindow( "Example2_5-out", cv::WINDOW_AUTOSIZE );
// Create a window to show our input image
//
cv::imshow( "Example2_5-in", image );
// Create an image to hold the smoothed output
// cv::Mat out;
// Do the smoothing
// ( Note: Could use GaussianBlur(), blur(), medianBlur() or bilateralFilter(). )
// cv::GaussianBlur( image, out, cv::Size(5,5), 3, 3); cv::GaussianBlur( out, out, cv::Size(5,5), 3, 3);
// Show the smoothed image in the output window
//
cv::imshow( "Example2_5-out", out );
// Wait for the user to hit a key, windows will self destruct
// cv::waitKey( 0 );
}
第一个cv::imshow()的调用和之前我们的使用方法没有什么差别。但是下一个调用的过程中,我们申请了另一个图像结构,接下来,C++对象cv::Mat使我们的工作变得轻松了。我们只需要实例化一个输出矩阵out,这将由程序自行管理并在合适的时候自动分配,释放内存。为了让这点更清晰,我们将其输入到两个cv::GaussianBlur()函数中。在第一次调用中,输入图像被5×5大小的高斯核模糊并且被写入out变量中。高斯核的大小必须是奇数,因为高斯卷积会在其覆盖区域的中心输出结果。在下一次调用 cv::GaussianBlur()的时候,由于被分配了临时的存储空间,所以out可以同时作为输入和输出。执行了两次模糊操作的图像被作为结果输出,在终止之前等待用户进行键盘事件,然后在对象生命周期结束的时候清理申请的内存。
- 点赞
- 收藏
- 关注作者
评论(0)