之前对一个opencv教程进行了翻译,现在贴出来和大家一起分享,希望对大家opencv的学习有所帮助。
Author(作者): Noah Kuntz (2008)
Contact(连接): nk752@drexel.edu
Keywords: OpenCV, computer vision(计算机视觉), image manipulaton, gaussian blur, avi
My Vision Tutorials Index(我的视觉教程指数)
This tutorial assumes the reader(看本教程的读者):
(1) Has a basic knowledge of Visual C++
(2) Has some familiarity with computer vision concepts
The rest of the tutorial is presented as follows:
- Step 1: Installing(安装) OpenCV
- Step 2: Displaying(显示) Images and Video
- Step 3: Simple Transformations
- Final Words
Important Note!(重要的注意事项)
More information on the topics of these tutorials can be found in this book:Learning OpenCV: Computer Vision with the OpenCV Library
Step 1: Installing OpenCV(安装OpenCV)
Install MSVC++ on windows and GCC or GLIBC on Linux(在Windows操作系统中安装MSVC + +和在Linux操作系统中安装GCC 或者 GLIBC) .
Download OpenCV from sourceforge (从sourceforge中下载OpenCV).
Use opencv-win or opencv-lin depending on your platform of choice ( 根据你选择的平台使用opencv-win或opencv-lin).
Optionally you may purchase Intel Integrated Performance Primitives (IPP) which optimizes the performance of OpenCV(当然你也可以购买英特尔集成性能基元(IPP),它优化了OpenCV的性能) .
Optionally update OpenCV using the "Concurrent Versions System," with software like Tortoise CVS( 可选用更新的使用 “并发版本系统”的OpenCV,和如项目开发管理软件Tortoise CVS的软件).
Now you must create a C++ project and link the correct files(现在您必须建立一个C++工程和链接正确的文件). These headers should be linked:(这些头文件应联系):
#include "C:\Program Files\OpenCV\cv\include\cv.h"
#include "C:\Program Files\OpenCV\ml\include\ml.h"
#include "C:\Program Files\OpenCV\cxcore\include\cxcore.h"
#include "C:\Program Files\OpenCV\cxcore\include\cxtypes.h"
#include "C:\Program Files\OpenCV\otherlibs\highgui\highgui.h"
Link to cv.lib, ml.lib, cxcore.lib, and highgui.lib Make sure to change the environment variable to PATH=C:\Program Files\OpenCV\bin(链接到cv.lib,ml.lib,cxcore.lib和highgui.lib,一定要确保改变环境变量到路径 C:\Program Files\OpenCV\bin)
Step 2: Displaying Images and Video(显示图像和视频)
An image displayed with OpenCV(用OpenCV显示一幅图片)
The first thing we can do with OpenCV is simply access an image (我们能做的第一件事就是用opencv简单地访问一幅图像). This code will display the image "MGC.jpg" in a window(这代码将会把"MGC.jpg"图像显示在一个窗口上).cvLoadImage loads the image into an IplImage* variable(cvLoadImage是把一个图像加载到IplImage* variable).cvNamedWindow creates a window andcvShowImage paints the image on the window(cvNamedWindow是创建一个窗口, cvshowimage是在窗口上显示图像). ThencvWaitKey(0) waits for any key to be pressed at which point the memory is released and the window is cleared withcvReleaseImage and cvDestroyWindow (然后cvWaitKey(0)等待任意键被按下而此时的内存被释放,该窗口通过cvReleaseImage和cvDestroyWindow函数被销毁).
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* img = cvLoadImage( "MGC.jpg" );
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
cvShowImage("Example1", img);
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
return 0;
}
The next step is to display a video(接下来的步骤是显示视频). Now we have to create aCvCapture* object withcvCreateFileCapture(现在我们要用cvCreateFileCapture创建一个CvCapture* object). We loop through the images usingcvQueryFrame to get each frame andcvWaitKey(33) to wait 33ms between each frame(我们通过循环使用cvQueryFrame获取每帧图像和cvWaitKey(33)每帧图像之间等待33ms). Then if the user presses Esc the loop breaks and the capture is released and the window closed(然后,如果用户按下Esc键循环中断,图像被释放且窗口被关闭). It should be noted that in order to capture from a camera instead of a video file, all that is needed is to replacecvCreateFileCapture withcvCreateCameraCapture(0) which will pick the first available camera interface(应当指出,为了从摄像头捕捉一个视频文件,而所有需要做的是取代cvCreateCameraCapture cvCreateFileCapture(0),将选择第一个可用的摄像头接口). Here is the code for playing a video(下面是播放视频的代码):
int _tmain(int argc, _TCHAR* argv[])
{
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( "MGC_RC_ATV.avi" );
IplImage* frame;
while(1) {
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "Example2", frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Example2" );
return 0;
}
Step 3: Simple Transformations(简单的转换)
Gaussian blur transformation(高斯模糊变换)
Next we would like to be able to do some actual processing on an image(接下来,我们希望能够做一些实际的图像处理). One simple transformation is a gaussian blur(一个简单的转化是一个高斯模糊). First we load an image as before, and make two windows(首先,我们像以前加载图像,编辑两个窗口). A new function in this example is creating an empty image to hold the output, with cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 ) which is saying make a new image the same size as "img", with 3 channels of 8 bits each(在这个例子中一个新功能是创建一个空的图象来保证输出,与cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3),这是说,作出了新的与“img”同样大小的8位与3个通道的图象). Then the gaussian blur is accomplished with cvSmooth( img, out, CV_GAUSSIAN, 11, 11 ) which puts the result in "out" and uses a window of 11 x 11 for the blur(然后高斯模糊用cvSmooth(img, out, CV_GAUSSIAN, 11, 11)完成, 把结果放在中"out",并用11 × 11窗口的模糊). Here is the code(以下是代码):
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* img = cvLoadImage( "MGC.jpg" );
cvNamedWindow( "Example3-in" );
cvNamedWindow( "Example3-out" );
// Show the original image
cvShowImage("Example3-in", img);
// Create an image for the output
IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
// Perform a Gaussian blur
cvSmooth( img, out, CV_GAUSSIAN, 11, 11 );
// Show the processed image
cvShowImage("Example3-out", out);
cvWaitKey(0);
cvReleaseImage( &img );
cvReleaseImage( &out );
cvDestroyWindow( "Example3-in" );
cvDestroyWindow( "Example3-out" );
return 0;
}
Downsample and Canny transformation(下采样和Canny变换)
Here is an example of more transformations, doing a pyramidal downsample of an image, and performing Canny edge detection(下面是一个例子的多个变换,做了一个图象的金字塔下采样,并进行Canny边缘检测). There are a few new things in this example(在这个例子中有一些新的东西). By adding an input of 0 to cvLoadImage the image is forced to be grayscale(通过增加一个0输入到cvLoadImage,图象被强制转换为灰度). This is required for Canny edge detection(这是对Canny边缘检测的要求). Also we use properties of the image loaded, for example "img->width."(此外,我们使用图像属性加载,例如,"img->width.") Using "->" you can see all the properties for the image that are available(使用 “->”你可以看到所有可用的图像属性). And then the image is processed usingcvPyrDown( img, out ) for the downsample, and thencvCanny( out, out, 10, 100, 3 ) for the edge detection(然后,该图像处理采用cvPyrDown( img, out )来下采样,然后用cvCanny( out, out, 10, 100, 3 )进行边缘检测). For the canny function the syntax is "input," "output," "lower threshold," "upper threshold," and "aperature." (canny的功能是"input," "output," "lower threshold," "upper threshold," and "aperature.")
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* img = cvLoadImage( "MGC.jpg", 0);
cvNamedWindow( "Example4-in" );
cvNamedWindow( "Example4-out" );
// Show the original image
cvShowImage("Example4-in", img);
// Make sure image is divisible by 2
assert( img->width%2 == 0 && img->height%2 == 0);
// Create an image for the output
IplImage* out = cvCreateImage( cvSize(img->width/2,img->height/2), img->depth, img->nChannels );
// Reduce the image by 2
cvPyrDown( img, out );
// Perform canny edge detection
cvCanny( out, out, 10, 100, 3 );
// Show the processed image
cvShowImage("Example4-out", out);
cvWaitKey(0);
cvReleaseImage( &img );
cvReleaseImage( &out );
cvDestroyWindow( "Example4-in" );
cvDestroyWindow( "Example4-out" );
return 0;
}
Final Words(结束语)
This tutorial's objective was to show how to do basic image loading and processing in OpenCV. Later tutorials in this series will expand on the functionality shown here. (本教程的目标是展示如何在OpenCV中做基本的图像加载和处理。在这个系列后面教程中,将扩大的功能讲解)
Click here to email me.
Click here to return to my Tutorials page.