搜档网
当前位置:搜档网 › OpenCV入门教程

OpenCV入门教程

OpenCV入门教程
OpenCV入门教程

(一) openCV的安装

1. 下载最新版openCV Beta 5, 网址为

color=#800080https://www.sodocs.net/doc/0a2442073.html,/technology/computing/opencv/index.ht m

2. 下载完毕后直接点击安装。安装完毕后打开_make文件夹下的.dsw(vc6)

或.sln(https://www.sodocs.net/doc/0a2442073.html,),点击project下的batch build,注意你的机子是32位的话,选重所有的

win32Debug 和Release(不要选择64位的),点击Rebuild。这样,所需要的库文件就生成了。下一步,要建你自己的文件。(PS:openCV Beta 5有一个bug,建立的时候需要改一个注释注错了的文件,在cvaux.h 中的1137行,)

3. 打开vc6或https://www.sodocs.net/doc/0a2442073.html,,新建一工程(win32console, win32project, MFC都可以,取决于你的习惯)

4. 配置你自己的工程

对于vc6: project à settings àall configurations

C/C++标签àCategory中选择Prepreocessor à Additional include directories项,输入以“,”分开的相对路径(注意相对路径的格式与你的openCV文件夹与你的工程文件夹相对位置有关),如我的工程建立在OpenCV的目录下,则我可以这样设置相对路

径:..\cvaux\include,..\cxcore\include,..\cv\include,..\otherlibs\highgui, ..\otherlibs\cvcam\include ; 当然,也可以输入绝对路径如C:\Program Files\OpenCV\cv\include…

Link标签à Category中选择General àObject/library modules, 输入以空格分开的cvd.lib highguid.lib cvauxd.lib cxcored.lib cvcamd.lib

Link标签à Category中选择Input àObject/library modules, 输入以空格分开的cvd.lib highguid.lib cvauxd.lib cxcored.lib cvcamd.lib

Link标签à Category中选择Input àAdditional Library path, 输入包含lib库的相对路径或绝对路径,我的工程相对路径设置为..\lib

设置完以上点击确定。

对于https://www.sodocs.net/doc/0a2442073.html,: projectàpropertiesàall configurations

C/C++àAdditional Include Directories à每行分开的相对路径或绝对路径,如我的工程里这样设

置..\..\cv\include ..\..\cvaux\include ..\..\highgui\include ..\..\otherlibs\highgui ..\..\otherlibs\cv cam\include

Linker à General àAdditional library directories: ..\..\lib

LinkeràInputàAdditional Dependencies: cv.lib cxcore.lib cvaux.lib cvcam.lib highgui.lib (每行一个)

设置完以上点击确定。

5.加入openCV的工程到你的工程里并设置依赖关系

vc6: ProjectàInsert project into workspace àcv\cv.dsp

同样加入cvaux.dsp, cxcore.dsp, highgui.dsp

ProjectàDependencies: cv选择cxcore; cvaux选择cv,cxcore; highgui选择cxcore;你的工程选择所有

https://www.sodocs.net/doc/0a2442073.html, FileàAdd project à Existing projectàcv\cv.vcproj

同样加入cvaux.vcproj, cxcore.vcproj, highgui.vcproj

在Solution Explorer中,鼠标右击Solution …your project? (5 projects)àproperties中设置依赖关同,同vc6

(二)openCV简单使用入门

这样就配置成功了,你可以使用openCV里。下面简单介绍一些openCV简单的图像操作的例子。帮助初学者入门。在使用时,只要把头文件包括进来就可以直接使用了。#include “cv.h”#include “highgui.h” (具体每个库中的内容,可参阅openCV手册)

1.打开图像

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//打开图像文件,成功返回IplImage*图像指针,否则返回NULL

//................................................................... ..................................................

IplImage* WINAPI imgFileOpen()

{

IplImage* pImg = 0; //声明IplImage指针

CString fileName = "";

//窗口对话窗体的文件属性

static char szFilter[] = "图像文件格式(*.bmp) |*.bmp|JPG file format (*.jpg)|*.jpg|TIF file format(*.tif) |*.tif|";

//打开文件对话窗口

CFileDialog OpenDlg( TRUE, NULL, NULL/*LastFilePath*/,

OFN_HIDEREADONLY | OFN_EXPLORER, szFilter, NULL );

OpenDlg.m_ofn.lpstrTitle = "Open BMP,JPG and TIF Files";

//从文件对话窗口中打开图像

if(OpenDlg.DoModal()==IDOK)

fileName = OpenDlg.GetPathName(); //获得文件名

else

return NULL;

//图像文件成功打开

pImg = cvLoadImage(fileName, 0);

//返回

return pImg;

}

2. 如果把上面打开的图像显示出来,则可以这样调用:

IplImage* pOpenImg = imgFileOpen(); //打开图像

Cstring srcWinLabel = “source image”;//窗体title

if(pOpenImg)//如果成功打开则显示

{

cvNamedWindow(srcWinLabel, 1); //创建窗体

cvShowImage(srcWinLabel, pOpenImg); //显示图像

cvWaitKey(0); //等待按键

cvReleaseImage(&pOpenImg);

cvDestroyWindow( srcWinLabel );//销毁窗口

}

3. 一些常用操作如角点检测:

BOOL WINAPI FindCorner(IplImage* srcImg1, double qualityLevel, double minDistance) {

//定义循环变得与检测角点数量

int i, cornerCount = max_corners;

//定义IplImage指针图像

IplImage* eigImage1 = 0;

IplImage* tempImage1 = 0;

IplImage* smoothImg1 = 0;

IplImage* grayImg1 = 0;

//初始化,分配空间

//浮点格式

eigImage1 = cvCreateImage(cvGetSize(srcImg1), IPL_DEPTH_32F, 1);

tempImage1 = cvCreateImage(cvGetSize(srcImg1), IPL_DEPTH_32F, 1);

//灰度单通道格式

smoothImg1 = cvCreateImage(cvGetSize(srcImg1), IPL_DEPTH_8U, 1);

grayImg1 = cvCreateImage(cvGetSize(srcImg1), IPL_DEPTH_8U, 1);

//格式转换:转换成灰度图像

if(srcImg1->nChannels !=1)

{

cvCvtColor(srcImg1, grayImg1, CV_BGR2GRAY);

}

else

{

cvCopy(srcImg1, grayImg1);

}

//启用高斯滤波,平滑图像

// cvSmooth(grayImg1,smoothImg1,CV_GAUSSIAN, 9, 9);

cvCopy(grayImg1, smoothImg1); //不平滑时把图像COPY到smoothImg1,以便后面处理

//角点

cvGoodFeaturesToTrack(smoothImg1, eigImage1, tempImage1, corners,

&cornerCount, qualityLevel, minDistance, 0);

//子像素极角点

cvFindCornerSubPix(smoothImg1, corners, cornerCount, cvSize(5,5), cvSize(-1,-1),

cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 100, 0.1) );

// draw circles at each corner location in the gray image and

// print out a list the corners 画出所有角点

if(cornerCount > 0)

{

for (i=0; i

{

cvCircle(srcImg1, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 6,

CV_RGB(255,0,0), 2, CV_AA, 0);

}

}

//创建窗体,以便显示标记出角点的图像

cvNamedWindow( "corners of image", 1);

//显示标记图像

cvShowImage( "corners of image", srcImg1 );

//等待按键

cvWaitKey(0);

//销毁窗体

cvDestroyWindow("corners of image");

//释放空间

cvReleaseImage(&eigImage1);

cvReleaseImage(&tempImage1);

cvReleaseImage(&smoothImg1);

cvReleaseImage(&grayImg1);//showImg1

//返回

return TRUE;

}

4.Hough 变换检测圆

BOOL WINAPI HoughCircle(IplImage* img)

{

if(img == NULL)

return FALSE;

IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );

CvMemStorage* storage = cvCreateMemStorage(0);

//转换成灰度图像

if(img->nChannels != 1)

cvCvtColor( img, gray, CV_BGR2GRAY );

else

cvCopy(img, gray);

//平滑化

cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 );

// Hough变换求圆

// CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2,

gray->height/4, 200, 100 );

CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2,

gray->height/4, 250, 55 );

// 画出识别出的圆

int i;

for( i = 0; i < circles->total; i++ ){

float* p = (float*)cvGetSeqElem( circles, i );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]),

CV_RGB(255,0,0), 3, 8, 0 );

// cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 100, CV_RGB(255,0,0), 3, 8, 0 );

}

// 窗体显示

cvNamedWindow("Win", 1);

// 画像表示

cvShowImage("Win", img);

// 等待按键

cvWaitKey(0);

// 释放

cvReleaseImage(&img);

cvReleaseImage(&gray);

cvDestroyWindow("Win");

return TRUE;

}

5. 再比如轮廓检测

//求轮廓/////////////////////

int levels = 3; ///

CvSeq* contours = 0; /// IplImage* imgContour; ///

/////////////////////////////

int upper = 80;

int lower = 10; CvMemStorage * storageContours;

void on_trackbarContour(int pos)

//定义变量

IplImage* cnt_img;

CvSeq* _contours;

int _levels;

//分配空间、初始化

cnt_img = cvCreateImage( cvGetSize(imgContour), 8, 3 );

_contours = contours;

_levels = levels - 3;

cvZero( cnt_img );

//画轮廓

cvDrawContours( cnt_img, _contours, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels, 1, CV_AA, cvPoint(0,0) );

//显示轮廓图像

cvShowImage( "contours", cnt_img );

//释放空间

cvReleaseImage( &cnt_img );

}

void WINAPI findContour( IplImage* pImg )

//定义指针变量

CvMemStorage* storage;

IplImage* img;

//初始化分配空间

storage = cvCreateMemStorage(0);

img = cvCreateImage( cvGetSize(pImg), IPL_DEPTH_8U, 1 );

imgContour = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 3);

//Copy图像,便于on_trackbarContour中操作

cvCopy(pImg, imgContour);

//转换成灰度图像

if(pImg->nChannels != 1)

cvCvtColor(pImg, img, CV_BGR2GRAY);

else

cvCopy(pImg, img);

//边缘提取

cvCanny(img, img, (float)33, (float)33*3, 3);//0.0, 100, 5);

//阈值分割

//cvThreshold( img, img, 150, 255, CV_THRESH_BINARY );

//创建窗体显示要操作的图像

cvNamedWindow( "image", 1 );

cvShowImage( "image", img );

//找轮廓

//CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE cvFindContours( img, storage, &contours, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );

// comment this out if you do not want approximation

contours = cvApproxPoly( contours, sizeof(CvContour), storage,

CV_POLY_APPROX_DP, 3, 1 );

//显示轮廓图像

cvNamedWindow( "contours", 1 );

cvCreateTrackbar( "levels+3", "contours", &levels, 50, on_trackbarContour );

on_trackbarContour(0);

cvWaitKey(0);

//释放空间销毁窗体

cvReleaseImage( &imgContour);

cvReleaseImage(&img);

cvClearSeq(contours);

cvClearMemStorage( storage );

cvDestroyWindow("contours");

cvDestroyWindow("image");

}

(三)openCV的资源

网络真的很方便,baidu和google上搜一搜就知道了,有很多人已经在使用openCV了。

在这里介绍几个论坛,上面有更多资源可以分享。

一是:阿须论坛。置顶的贴子有对OpenCV资源,邮件列表的总介绍。

二是:机器视觉网、机器视在线以及研学论坛等。上面也有OpenCV版。

三是:QQ群,如比较不错的群:OpenCV(号码17319732)、视觉/图像/博士联盟(20441383)

相关主题