(一) 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)