Opencv源码编译
For Ubuntu For Android For Windows
Version0.1
2013.06.06
目录
1.Ubuntu下编译opencv源代码(For linux&Android) (2)
1.1下载opencv源码 (2)
1.2下载安装Cmake (2)
1.3安装一些ubuntu下必要的库文件: (2)
1.4使用Cmake进行配置: (3)
1.5编译opencv生成linux下的opencv库文件 (3)
1.6测试linux下Opencv例程: (4)
1.7Opencv For Android的编译 (4)
1.7.1安装ndk: (4)
1.7.2安装Android SDK (5)
1.7.4开始编译opencv中关于android相关的源码 (5)
2.Ubuntu下codeblocks Opencv开发环境配置 (7)
2.1下载安装codeblocks (7)
2.2打开cldeblocks建立一个摄像头的测试程序: (8)
2.3配置工程的头文件和链接库 (8)
3.Windows7+codeblocks Opencv开发环境搭建 (11)
3.1下载opencv2.2 (11)
3.5打开CMake (12)
3.6环境变量的设置 (12)
3.7在CMake中点击configure (14)
3.8编译oepncv源码 (15)
3.8.1先进入E盘 (15)
3.8.2进入目录OpenCV-2.2.0-build (15)
3.8.3编译opencv源码 (16)
3.8.4安装opencv库文件 (16)
3.9使用codeblocks建立openv工程 (17)
3.10测试代码 (18)
3.11给工程文件添加opencv相关路径 (19)
3.12编译工程文件 (22)
附其他参考资料备忘 (23)
1.Ubuntu下编译opencv源代码(For linux&Android)
1.1下载opencv源码
Opencv各个版本的下载地址:
https://www.sodocs.net/doc/b14837724.html,/index.php/Download(opencv中文网)
https://www.sodocs.net/doc/b14837724.html,/projects/opencvlibrary/files/(opencv英文网)
建立目录~/Opencv2.2
将其解压到~/Opencv2.2/OpenCV-2.2.0
并在~/Opencv2.2中建立opencv-build目录,用来存放编译后的opencv库
1.2下载安装Cmake
下载网址:https://www.sodocs.net/doc/b14837724.html,/cmake/resources/software.html
这里采用命令行安装Cmake的方式
sunny@SUNNYART:~$sudo apt-get install cmake
sunny@SUNNYART:~$sudo apt-get install cmake-qt-gui
1.3安装一些ubuntu下必要的库文件:
sudo apt-get install pkg-config libgtk2.0-dev libjpeg libtiff libjasper libpng zlib openexr libjpeg-dev ffmpeg libgstreamer libv4l libv4l-0libv4l-dev libxine unicap libavformat-dev libswscale-dev swig libjpeg-progs build-essential python-numpy
1.4使用Cmake进行配置:
打开Cmake:
sunny@SUNNYART:~$cmake-gui
进行配置:
首先按照之前建立的文件夹路径,选择好opencv源码路径和build路径
源码路径为:~/Opencv2.2/OpenCV-2.2.0
Build目标路径:~/Opencv2.2/OpenCV-2.2.0
然后点击Configure(可能需要点击两次),然后点击Generate,配置工作就完成了。
(可能使用Cmake进行配置就是为了生成面向不同开发目标平台的Makefile,之后再用编译器编译出相应的opencv的库文件)
1.5编译opencv生成linux下的opencv库文件
sunny@SUNNYART:~$cd~/2.2opencv/opencv-build/
sunny@SUNNYART:~/2.2opencv/opencv-build$make
编译完成后,执行安装命令将生成的库文件安装到Ubuntu系统的相应路径中去
sunny@SUNNYART:~/2.2opencv/opencv-build$make install
对于Ubuntu
头文件会安装到:urs/local/include
库文件会安装到:usr/local/lib
至此Opencv在Linux下的库文件就编译和安装完成了。可以使用codeblocks调用库文件进行Opencv的开发。(具体的codeblocks开发Opencv环境的搭建将在下一章进行讲解),在编译中如果总是出错,有可能是选择的Opencv版本与Ubuntu中相关环境的版本不匹配,所以最好选择poencv2.2或者是opencv2.0
1.6测试linux下Opencv例程:
终端下转到刚才解压的OpenCV-2.2.0/samples/c文件夹下,里面有一个build_all.sh脚本,执行它:bash./build_all.sh,成功之后,ls命令查看,生成了一个facedetect执行文件,./facedetect
执行它!如果弹出一个捕捉脸部的窗口,就成功了。
sunny@SUNNYART:~$cd/home/sunny/2.2opencv/OpenCV-2.2.0/samples/c
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/samples/c$bash./build_all.sh
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/samples/c$./facedetect
注:如果在最后执行facedetect时报错:./facedetect:error while loading shared libraries: libopencv_core.so.2.2:cannot open shared object file:No such file or directory。
这是因为你没有装ffmpeg,输入sudo-apt-get install ffmpeg安装,安装成功之后再执行facedectect即可!
1.7Opencv For Android的编译
1.7.1安装ndk:
由于Google官方版本的Android ndk并不能完全支持所有的C++特性,所以如果要使用Opencv就必须重新安装经过特殊修改的ndk:
下载网址:https://www.sodocs.net/doc/b14837724.html,/android/ndk-r4.php(注意选择相应的版本)
下载之后将其解压到自己的home目录。在家目录(~)下会生成android-ndk-r4-crystax
目录。(注:这个目录是源码中相应Makefile配置的相应默认NDK目录)
Tips:The android ndk,now referred to as the ndk,is the gcc toolchain for android,and is what creates the shared libraries for android that are loadable by android apps through a the Java Native Interface(JNI)
1.7.2安装Android SDK
从google开发网站上下载android SDK,安装完整个SDK后,需要将tools、platform-tools 等工具的目录添加到系统的PATH环境变量中,方便之后在任意路径下使用SDK的相关工具。
对于使用硬件手机平台测试android程序,有时候可能需要对USB进行相关的配置。具体设置方法参见之前的文档
1.7.4开始编译opencv中关于android相关的源码
1.7.4.1静态库的编译
sunny@SUNNYART:~$cd2.2opencv/OpenCV-2.2.0/android/
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android$mkdir build
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android$cd build/
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/build$
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/build$cmake..
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/build$make
编译阶段会花费一些时间
1.7.4.2共享库的编译
sunny@SUNNYART:~$cd2.2opencv/OpenCV-2.2.0/android/android-jni
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/android-jni$make
首先进行make首次会提醒修改local.env.mk,这里就是进行配置NDK的相关的路径。
如果自己的NDK已经解压到了${HOME}目录,就不需要进行修改:
local.env.mk文件
路径为:/home/sunny/2.2opencv/OpenCV-2.2.0/android/android-jni/local.env.mk
文件内容如下:
#location of android-opencv.mk file that was generated by the cmake build
#of opencv for android
OPENCV_CONFIG=../build/android-opencv.mk
#the root directory of the crystax r4ndk-ndk-build should be in this dir
#you can download the ndk from https://www.sodocs.net/doc/b14837724.html,/android/ndk-r4.php
ANDROID_NDK_ROOT=$(HOME)/android-ndk-r4-crystax
#define only armeabi-v7a to make the final apk smaller or armeabi
ARM_TARGETS="armeabi armeabi-v7a"
修改完路径之后,再次make,就开始编译共享链接库了。
注意:每个工程文件的目录下都会由一个local.env.mk文件用于配置相关的NDK路径,在下面编译例子程序CvCamera的时候也要注意。最好是将NDK解压到家目录,这样在以后就不需要进行配置了。
1.7.4.3安装ant进行Java相关的编译
ant版本最好要1.8以上
sunny@SUNNYART:~$sudo apt-get install ant1.8
安装完成之后,就开始接着编译Java先关的部分:
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/android-jni$sh./project_create.sh sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/android-jni$ant compile
至此Opencv中关于Android的相关代码就编译完成了。最终的生成文件可能是在:
~/2.2opencv/OpenCV-2.2.0/android/build/obj/local目录中,这些在配置eclipse+android+opencv 的开发环境会用到。(具体到时候再进行验证)
Opencv-2.2.0_
|_android_
|_android-jni
|_apps
|_build
上面是opencv源码中android相关目录架构,其中apps目录下是一些opencv android的例子程序。在build目录下是最终编译出来的相关库文件。
1.7.4.4编译安装android下的测试程序CVCamera
sunny@SUNNYART:~$cd2.2opencv/OpenCV-2.2.0/android/apps/CVCamera/
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/apps/CVCamera$sh build.sh
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/apps/CVCamera$make
这一步主要是建立swig wrappers and shared library.
(SWIG是一种简化脚本语言与C/C++接口的开发工具。简而言之,SWIG是一个通过包装和编译C 语言程序来达到与脚本语言通讯目的的工具。)
接下来开始编译生成android apk
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/apps/CVCamera$sh project_create.sh sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/apps/CVCamera$ant debug
这样就在当前目录下的bin目录生成了debug版的apk:CVCamera-debug.apk
执行下面的命令将apk安装到手机上(事先已经通过USB连接手机)
sunny@SUNNYART:~/2.2opencv/OpenCV-2.2.0/android/apps/CVCamera$ant install
上面的整个过程,既是用来检验opencv编译的是否成功也是android opencv编程及编译的很好的例子。
(Try to edit the local.env.mk file's that get created in CVCamera and android-jni to reflect your system.)
2.Ubuntu下codeblocks Opencv开发环境配置
在linux PC中使用codeblocks IDE进行Opencv的开发仅仅需要将上一章中编译生成的Opencv的头文件和库文件,加入编译搜索路径即可。
2.1下载安装codeblocks
网址:https://www.sodocs.net/doc/b14837724.html,/downloads/26
老版本:https://www.sodocs.net/doc/b14837724.html,/downloads/source/5
注意要下载稳定版不要下载测试版或者debug版
2.2打开cldeblocks建立一个摄像头的测试程序:
先在家目录下建立一个文件夹workplace专门用来存放codeblocks的工程文件。
建立的工程文件名为:camera_demo
测试代码如下:
#include
int main()
{
int c;
IplImage*img;
CvCapture*capture=cvCaptureFromCAM(-1);
cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin",50,50);
while(1)
{
img=cvQueryFrame(capture);
cvShowImage("mainWin",img);
c=cvWaitKey(10);
}
//按ESC键离开
if(c==27)
break;
}
cvReleaseImage(&img);
cvDestroyWindow("mainWin");
return0;
}
2.3配置工程的头文件和链接库
在左侧的projects窗口中在工程文件camera_demo上鼠标右键,然后选择Build options...
在弹出来的对话框中进行配置,左边是选择配置Debug版本还是Release版本,可以两个都配置一遍。首先在Linker settings中点击Add按钮,添加opencv的库文件。
路径:/usr/local/lib,将其中的所有.so文件都添加进来。
然后配置路径:
1头文件路径:
在Search directories中选中Compiler,点击Add按钮,将两个opencv的头文件目录添加
路径:/usr/local/include/opencv
路径:/usr/local/include/opencv2
紧接着在Linker选项中点击Add按钮,将lib的路径添加
路径:/usr/local/lib
至此相关的配置就完成了,可以点击运行按钮,进行编译测试。
但是以上的配置都是针对本工程文件的,如果下次再新建工程就失效了。如果想要对全局生效,就要在菜单栏的Settings->Compiler...->Global compiler settings重复设置刚才的过程:
相关参考网址:
编译Ubuntu下Opencv:https://www.sodocs.net/doc/b14837724.html,/huangmou37/article/details/6207800
编译opencv forAndroid https://www.sodocs.net/doc/b14837724.html,/cwyalpha/item/b76f6cc0601a522def46652d(opencv)官方编译for android:https://www.sodocs.net/doc/b14837724.html,/wiki/Android2.2
官方配置for codeblocks:https://www.sodocs.net/doc/b14837724.html,/wiki/CodeBlocks
配置for codeblocks:https://www.sodocs.net/doc/b14837724.html,/hitwengqi/article/details/7985343
3.Windows7+codeblocks Opencv开发环境搭建
(注:以下的每个路径都需要根据自己安装时设置的路径进行修改)
3.1下载opencv2.2
网址:https://www.sodocs.net/doc/b14837724.html,/index.php/Download#Version_2.2
直接下载网址:https://www.sodocs.net/doc/b14837724.html,/download/OpenCV-2.2.0-win.zip
3.2解压OpenCV-2.2.0-win.zip到E:\OpenCV-2.2.0,并且建立空文件夹E:\OpenCV-2.2.0-build
3.3下载CMake2.8网址:https://www.sodocs.net/doc/b14837724.html,/cmake/resources/software.html
3.4安装CMake按照默认的配置,一路next
3.5打开CMake
在上面的两个路径中分别找到opencv的源代码目录E:\OpenCV-2.2.0,和自己新建的空文件夹E:\OpenCV-2.2.0-build,这个目录用来生成opencv的编译结果。
3.6环境变量的设置
本文之前已经安装好codeblocks,在其安装的目录下会有MinGW工具(即:即Minimalist GNU For Windows),里面是用来编译opencv源码的编译工具。需要将他们的路径添加到系统的环境变量Path中。(系统的Path或是当前用户的Path都行)
方法:
开始->计算机->右键->属性->高级系统设置->环境变量
在Path中添加如下
C:\Program Files(x86)\CodeBlocks\MinGW\bin (注意各个路径之间需要使用英文的分号;隔开) MinGW路径
环境变量的设置
3.7在CMake中点击configure
选择生成的目标平台为codeblocks MinGW,然后点击FInish
configure之后,再点击generate生成。这时E:\OpenCV-2.2.0-build下会生成lib目录。
3.8编译oepncv源码
windows键+R,打开cmd进入windows下的DOS命令行终端,在命令行下进入E:\OpenCV-2.2.0-build目录。
方法:
3.8.1先进入E盘
输入E:
3.8.2进入目录OpenCV-2.2.0-build
输入cd OpenCV-2.2.0-build
3.8.3编译opencv源码
在命令行下输入
mingw32-make
然后需要等待很久,进行编译
3.8.4安装opencv库文件
命令行下输入
mingw32-make install
完成之后
会在OpenCV-2.2.0-build/lib文件夹下会生成库文件:
会在OpenCV-2.2.0-build/include文件加下会生成头文件:
3.9使用codeblocks建立openv工程
打开codeblocks,菜单栏上:File->New->Project->Console application->C++
输入文件名(opencv_test),选择存放的目录,然后点击Finish
3.10测试代码
将测试代码粘贴到main.cpp文件中
#include
int main()
{
int c;
IplImage*img;
CvCapture*capture=cvCaptureFromCAM(-1);//此处-1代表自动检测cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin",50,50);
while(1)
{
img=cvQueryFrame(capture);
cvShowImage("mainWin",img);
c=cvWaitKey(10);
if(c==27)
break;
}
cvReleaseImage(&img);
cvDestroyWindow("mainWin");
return0;
}
但是此时编译还不能成功,因为codeblocks的编译器还不知道opencv的头文件和相应的库文件的位置,在编译的时候就无法进行include的链接库文件。
3.11给工程文件添加opencv相关路径
在codeblocks左侧的Projects下在工程opencv_test上右键选择Build options
首先添加opencv库文件:
在Linker settings下,点击Add,然后将E:/OpenCV-2.2.0-build/lib文件夹下的库文件全部添
加。
然后添加opencv的相关搜索路径,在Search directories下
首先是include路径的添加,选中Compiler然后点击Add将E:/OpenCV-2.2.0-build/include
添加进去。
然后是lib路径的添加,选中Linker,然后点击Add将E:/OpenCV-2.2.0-build/lib添加进去。
最后还要将opencv的bin目录添加到系统的环境变量中去
方法:
开始->计算机->右键->属性->高级系统设置->环境变量
在Path中添加如下
E:/OpenCV-2.2.0-build/bin
(注意同前一个路径之间要使用英文的分号;隔开)
此时opencv的相关配置就完成了。
3.12编译工程文件
点击Build and run按钮,进行编译。
注:如果不添加环境变量,也可以在CMake中配置的时候选中特殊的本地编译器,然后选择刚刚codeblocks安装目录中的相应MinGW编译器。
-----------------------------------完----------------------------------------------------------------------------
附其他参考资料备忘
#include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include
CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();
OpenCV成长之路(8):直线、轮廓的提取与描述 分类:OpenCV成长之路2014-01-04 18:35 689人阅读评论(0) 收藏举报 直线、轮廓的提取与描述基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条、轮廓、块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用。 一、Canny检测轮廓 在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题。而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在做图像轮廓提取方面是最优秀的边缘检测算法。 canny边缘检测采用双阈值值法,高阈值用来检测图像中重要的、显著的线条、轮廓等,而低阈值用来保证不丢失细节部分,低阈值检测出来的边缘更丰富,但是很多边缘并不是我们关心的。最后采用一种查找算法,将低阈值中与高阈值的边缘有重叠的线条保留,其他的线条都删除。 本篇文章中不对canny的算法原理作进一步说明,稍后会在图像处理算法相关的文章中详细介绍。 下面我们用OpenCV中的Canny函数来检测图像边缘 1.int main() 2.{ 3. Mat I=imread("../cat.png"); 4. cvtColor(I,I,CV_BGR2GRAY); 5. 6. Mat contours; 7. Canny(I,contours,125,350); 8. threshold(contours,contours,128,255,THRESH_BINARY); 9. 10. namedWindow("Canny"); 11. imshow("Canny",contours);
目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp
/. #include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include
CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();
*#include "stdafx.h" #include "cv.h" #include "highgui.h" using namespace cv; using namespace std; //标示符的可见范围 CvPoint2D32f GetCPoint(IplImage* imageFg,int maxX); void FitEllipseBlob(IplImage* imageFg); int main( int argc, char** argv ) { IplImage* pImg; //声明IplImage指针 //载入图像 pImg = cvLoadImage( "C:\\Users\\BB\Desktop\\bec\\OPENCV椭圆拟合定位椭圆中心点以及重心法定位程序\\OPENCV椭圆拟合定位椭圆中心点以及重心法定位程序\\特征中心点提取误差分析\\image.bmp", 1);//[[此处的argc==2是否需要改成argc==1?我改了之后才能运行成功。求大牛解惑]] // wmzzzz : 在"属性"|"debug"|里的command arguments 里加入参数(一个路径:要打开的文件路径) 这时argc==2 就合理了...可以试试多加几个 int pointX = 0; for (int i=0;i<19;i++) { pointX=60*i+30; cvEllipse(pImg,cvPoint(pointX,80),cvSize(19,20),-200,0,360,CV_RGB(255,255,255),-1,CV _AA,0); } IplImage* m_imageGray = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1); IplImage* m_imageBw = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1); cvCvtColor(pImg,m_imageGray,CV_RGB2GRAY); cvThreshold(m_imageGray,m_imageBw,128,255,CV_THRESH_BINARY); CvPoint2D32f pointXX; float XXX,YYY; for (int i = 0;i<19;i++) {
// cvCalib.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include
基于opencv 对图像的预处理 1.问题描述 本次设计是基于opencv 结合c++语言实现的对图像的预处理,opencv 是用于开发实时的图像处理、计算机视觉及模式识别程序;其中图像的预处理也就是利用opencv 对图像进行简单的编辑操作;例如对图像的对比度、亮度、饱和度进行调节,同时还可以对图像进行缩放和旋转,这些都是图像预处理简单的处理方法;首先通过opencv 加载一幅原型图像,显示出来;设置五个滑动控制按钮,当拖动按钮时,对比度、亮度、饱和度的大小也会随之改变,也可以通过同样的方式调节缩放的比例和旋转的角度,来控制图像,对图像进行处理,显示出符合调节要求的图像,进行对比观察他们的之间的变化。 2.模块划分 此次设计的模块分为五个模块,滑动控制模块、对比度和亮度调节模块、饱和度调节模块、缩放调节模块、旋转调节模块,他们之间的关系如下所示: 图一、各个模块关系图 调用 调用 调用 调用 滑动控制模块 对比度和亮度调节模块 饱和度调节模块 缩放调节模块 旋转调节模块
滑动控制模块处于主函数之中,是整个设计的核心部分,通过createTrackbar创建五个滑动控制按钮并且调用每个模块实现对图像相应的调节。 3.算法设计 (1)滑动控制: 滑动控制是整个设计的核心部分,通过创建滑动控制按钮调节大小来改变相应的数据,进行调用函数实现对图像的编辑,滑动控制是利用createTrackbar(),函数中包括了滑动控制的名称,滑动控制显示在什么窗口上,滑动变量的地址和它调节的最大围,以及每个控制按钮应该调用什么函数实现什么功能; (2)对比度和亮度的调节: 对比度和亮度的调节的原理是依照线性理论,它的公式如下所示:g(x)=a* f(x) +b,其中f(x)表示源图像的像素,g(x)表示输出图像的像素,参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度,参数b通常被称为偏置(bias),常常被用来控制图像的亮度; (3)饱和度的调节: 饱和度调节利用cvCvtColor( src_image, dst_image, CV_BGR2HSV )将RGB 颜色空间转换为HSV颜色空间,其中“H=Hue”表示色调,“S=Saturation”表示饱和度,“V=Value ”表示纯度;所以饱和度的调节只需要调节S的大小,H 和V的值不需要做任何的改变; (4)旋转的调节: 旋转是以某参考点为圆心,将图像的个点(x,y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x1,y1),x1=rcos(α+θ),y1=rsin(α+θ),其中r是图像的极径,α是图像与水平的坐标的角度的大小; (5)缩放的调节: 首先得到源图像的宽度x和高度y,变换后新的图像的宽度和高度分别为x1和y1,x1=x*f,y1=y*f,其中f是缩放因子; 4.函数功能描述 (1)主函数main()用来设置滑动控制按钮,当鼠标拖动按钮可以得到相应的数据大小,实现手动控制的功能,当鼠标拖动对比度和亮度调节是,主函数调用
// // The full "Square Detector" program. // It loads several images subsequentally and tries to find squares in // each image // #ifdef _CH_ #pragma package
本程序主要实现的是车牌的定位与检测 主要是利用申继龙论文里面的方法 1、采集得到的图像 2、把RGB图像转换成HSI彩色图像 3、利用设定的H、S阈值得到二值图像 4、对二值图像水平投影获得候选区域 5、对候选区域的HSI图像边缘检测 */ #include "stdafx.h" #include "opencv2/opencv.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2/legacy/legacy.hpp" #include "opencv2/legacy/compat.hpp" #include
?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?
万方数据
万方数据
万方数据
2010年6月中同制造、Ip信息化第39卷第11期 图2汽车车身部分原始图像1图4基于本文算法的处理结果1 图3汽车车身部分原始图像2图5基于本文算法的处理结果2 方便,具有广阔的应用前景。本文针对灰度分布不 均匀的图像,首先,通过对图像开窗后进行局部灰参考文献: 碱∞∞Pan肌AnalysisandM8ch妇1n‘e11igence,1986,度变换来改进边缘检测的效果,对窗口交界处再开hiCannyJA.Ccmaputationalapproachtoedgedetection[J].IEEE 设几个很小的窗口实现拼接来去除窗口交界处的 皇假边缘;其次,詈用自适璺阈值的改进型Canny[2]8章(6毓)晋:67.图9-像69处8理.与分析[M】.|匕京:清华大学出版社,1999:算法动态地随图像梯度幅值变化而变化。通过试懈一枷 验证明,本文的方法对于不同噪声干扰和光照背景[3]杨枝灵,王开.WLsualc++数字图像获取、处理及实践应下的图像,能够获得较好的处理效果,其抗噪性能用[M].北京:人民邮电出版社,2003:553—572. 好,定位精度高。利用该算法对汽车图像进行边缘[4]刑果?戚文芽,李萍,等?灰度图像的自适应边缘检测 [J].计算机工程与应用,2007,43(5):63—66? 检测,检测出的汽车边缘连续、清晰。 ApplicationofOpenCV——basedEdgeDetectionAgorithm intheVehicle——bodyDimensionDetection CHENWei—li,TANG/-Ion,GENGYah—biao (NorthwesternPolytechnicalUniversity,ShaanxiXi’aJl,710072,China) Abstract:Itmainlyintroducesthesolutiontoimprovetheefficiencyoftheedgedetection,whichcombinesthe detectionalgorithmofthestatisticalimagewindowcalculationwiththeenhancedCannyedgedetectionalgo—rithm.ItusesOpenCVdatabase雒basicfunctionlibraryandappliesthisagorithmtothevehicle—bodydi—mensiondetection.Thetestresultsshowthattheprocessingofedgedetectionismoreeffectiveandquicker.Keywords:Edge——detection;ImageProcess;Vehicle——bodyDimension 万方数据
#include "cv.h" #include "highgui.h" #include
openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3
对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/
C a n n y边缘检测与轮 廓提取
摘要................................................................................................................................................... Abstract.......................................................................................................................................... I 1 绪论 0 2 设计内容与OpenCV简介 (1) 2.1 设计任务内容 (1) 2.2 OpenCV简介 (1) 3 理论分析 (2) 3.1 边缘检测 (2) 3.1.1 图像的边缘 (2) 3.1.2 边缘检测的基本步骤 (2) 3.2 轮廓提取 (3) 4 边缘检测的算法比较 (4) 4.1 Reborts算子 (4) 4.2 Sobel算子 (5) 4.3 Prewitt 算子 (5) 4.4 Kirsch 算子 (7) 4.5 LOG算子 (7) 4.6 Canny算子 (8) 5 实验仿真 (10) 5.1算法设计 (10) 5.2 实验结果 (11) 6 分析与总结 (12) 参考文献 (13) 附录 (14)
边缘检测是图像处理和计算机视觉中的基本问题,它的目的是标识出数字图像中亮度变化明显的点。图像经过边沿检测处理之后,不仅大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。 事实上,边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置。这些轮廓常常是我们在图像边缘检测时,所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。 可用于图像边缘检测和轮廓提取的方法有很多,其中包括有常见的Robert边缘算子、Prewitt 边缘算子、Sobel边缘算子等等。本文首先将会从数字图像处理的角度,对几种边缘检测算法进行详细的分析,然后会并选择其中一种边缘检测算法进行实验。考虑到以后进一步的学习,本文将会使用openCV对算法进行实现。最后,本文将会把实验获得的实际效果,与理论分析的结果进行比对,并以此对本次实验进行总结。 关键字:边缘检测轮廓提取图像处理openCV
竭诚为您提供优质文档/双击可除opencv,模板匹配源码 篇一:opencv模板匹配 opencv模板匹配 V1.0 zhbrain 1、2、1)2)3、1)2) opencv模板匹配原理--没有金字塔................................................. ..........................4模板匹配—使用金字塔................................................. ...............................................5主要函数简介................................................. ................................................... ........5程序流程................................................. ................................................... ................5验证和结
果................................................. ................................................... ...............5实验环境................................................. ................................................... ................5实验结果................................................. ................................................... . (5) opencv模板匹配 1、opencv模板匹配原理--没有金字塔 函数: cvmatchtemplate(source,target,result,method);说明:source:源图像,一般我们使用灰度图像;如果source 为Rgb图像,使用函数cvcvtcolor(source,dst,cV_Rgb2gRay)这里,dst为转换后的灰度图像。target:模板图像。 Result:匹配后的矩阵,width=s_width–t_taget+1,height=s_height–t_height+1使用函数 iplimage*result=cvcreateimage(resultsize,ipl_depth_ 32F,1)获得。method:cV_tm_sqdiFF: cV_tm_sqdiFF_noRmed cV_tm_ccoRR