【opencv入门篇】 10个程序快速上手opencv【上】

导言本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:)

PS:官方文档永远是最好的入门资料,逐步提高英文阅读能力也很重要:)

官方文档传送门:

【英】http://www.docs.opencv.org/2.4.6/#

【中】http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html

环境配置:http://www.cnblogs.com/always-chang/p/6170222.html

学习笔记思维导图:

【opencv入门篇】 10个程序快速上手opencv【上】

1、第一个opencv程序——读取一张照片
 #include "highgui.h" 

 int main(int argc, char** argv)
{
const char *imgpath = "opencv.jpg";
IplImage *img = cvLoadImage(imgpath);//加载图像文件至内存
cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);//创建一个名为Example1的窗口
cvShowImage("Example1", img);//显示图像
cvWaitKey();//等待用户触发按键
cvReleaseImage(&img);//释放图片占用的内存
cvDestroyWindow("Example1");//销毁窗口 return ;
}

注意:图像在主函数所在文件夹。

运行结果:

【opencv入门篇】 10个程序快速上手opencv【上】

2、缩放图片

主要函数介绍

1)cvResize

函数功能:图像大小变换

函数原型:

voidcvResize(

const CvArr* src,

CvArr* dst,

intinterpolation=CV_INTER_LINEAR

);

函数说明:

第一个参数表示输入图像。

第二个参数表示输出图像。

第三个参数表示插值方法,可以有以下四种:

CV_INTER_NN - 最近邻插值,

CV_INTER_LINEAR - 双线性插值 (缺省使用)

CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..

CV_INTER_CUBIC - 立方插值.

这个函数在功能上与Win32 API中的StretchBlt()函数类似。

2) cvCreateImage

函数功能:创建图像

函数原型:

IplImage* cvCreateImage(CvSize size, intdepth,intchannels);

函数说明:

第一个参数表示图像的大小。

第二个参数表示图像的深度,可以为IPL_DEPTH_8U,IPL_DEPTH_16U等等。

第三个参数表示图像的通道数

 #include <opencv2/opencv.hpp>
using namespace std;
//隐藏控制台窗口
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
int main()
{
const char *pstrImageName = "cyh.jpg";
const char *pstrSaveImageName = "cyh缩放图.jpg";
const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsDstTitle = "缩放图"; double fScale = 0.5; //缩放倍数
CvSize czSize; //目标图像尺寸 //从文件中读取图像
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pDstImage = NULL; //计算目标图像大小
czSize.width = pSrcImage->width * fScale;
czSize.height = pSrcImage->height * fScale; //创建图像并缩放
pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels);
cvResize(pSrcImage, pDstImage, CV_INTER_AREA); //创建窗口
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE); //在指定窗口中显示图像
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
cvShowImage(pstrWindowsDstTitle, pDstImage); //等待按键事件
cvWaitKey(); //保存图片
cvSaveImage(pstrSaveImageName, pDstImage); cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsDstTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pDstImage);
return ;
}

输出:

【opencv入门篇】 10个程序快速上手opencv【上】

3、图像边缘提取

主要函数介绍

1) cvCanny

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvCanny(

const CvArr* image,

CvArr* edges

double threshold1,double threshold2,

int aperture_size=3

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。

第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。

为了更好的使用cvCanny()函数,下面再介绍二个实用的函数,这二个函数对后面的程序实现非常有帮助。

2)cvCreateTrackbar

函数功能:创建trackbar并添加到指定窗口

函数原型:

intcvCreateTrackbar(

const char* trackbar_name,

const char* window_name,

int* value,

intcount,

CvTrackbarCallback on_change

);

函数说明:

第一个参数表示该trackbar的名称。

第二个参数表示窗口名称,该trackbar将显示在这个窗口内。

第三个参数表示创建时滑块的位置。

第四个参数表示滑块位置的最大值,最小值固定为0。

第五个参数表示回调函数。当滑块位置有变化时,系统会调用该回调函数。

注:被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos()来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos()来重新设置trackbar的显示位置。

3)CvTrackbarCallback

函数功能:cvCreateTrackbar()函数所使用的回调函数

函数定义:

typedef void (CV_CDECL *CvTrackbarCallback)(int pos)

函数说明:

当trackbar位置被改变的时,系统会调用这个回调函数,并将参数pos设置为表示trackbar位置的数值。

 #include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") IplImage *g_pSrcImage, *g_pCannyImg;
const char *pstrWindowsCannyTitle = "边缘检测图";
//cvCreateTrackbar的回调函数
void on_trackbar(int threshold)
{
//canny边缘检测
cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * , );
cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);
}
int main()
{
const char *pstrImageName = "cyh.jpg";
const char *pstrWindowsGrayTitle = "灰度图";
const char *pstrWindowsToolBar = "Threshold"; //从文件中载入图像的灰度图CV_LOAD_IMAGE_GRAYSCALE - 灰度图
g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, ); //创建窗口
cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE); //创建滑动条
int nThresholdEdge = ;
cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, , on_trackbar); //在指定窗口中显示图像
cvShowImage(pstrWindowsGrayTitle, g_pSrcImage);
on_trackbar(); //等待按键事件
cvWaitKey(); cvDestroyWindow(pstrWindowsGrayTitle);
cvDestroyWindow(pstrWindowsCannyTitle);
cvReleaseImage(&g_pSrcImage);
cvReleaseImage(&g_pCannyImg);
return ;
}

输出:

【opencv入门篇】 10个程序快速上手opencv【上】

4、图像二值化

【多说几句】灰度图像和二值图像

灰度图像:从一个通道进行采样得到的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度(0~255)。灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的。

使用灰度图的好处:

①RGB的值都一样。

②图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。

③因为是256色调色板,所以图像数据中一个字节代表一个像素,很整齐。

【opencv入门篇】 10个程序快速上手opencv【上】

二值图像:图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。

将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

 主要函数介绍:

1)cvThreshold

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvThreshold(

const CvArr* src,

CvArr* dst,

double threshold,

double max_value,

int threshold_type

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值

第四个参数表示最大值。

第五个参数表示运算方法。

在OpenCV的imgproc\types_c.h中可以找到运算方法的定义。

/* Threshold types */

enum

{

CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */

CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */

CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */

CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */

CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */

CV_THRESH_MASK        =7,

CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */

};

 #include <opencv2/opencv.hpp>
using namespace std; #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") IplImage *g_pGrayImage = NULL;
IplImage *g_pBinaryImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图"; void on_trackbar(int pos)
{
// 转为二值图
cvThreshold(g_pGrayImage, g_pBinaryImage, pos, , CV_THRESH_BINARY);
// 显示二值图
cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);
} int main(int argc, char** argv)
{
const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsToolBarName = "二值图阈值"; // 从文件中加载原图
IplImage *pSrcImage = cvLoadImage("cyh.jpg", CV_LOAD_IMAGE_UNCHANGED); // 转为灰度图
g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, );
cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY); // 创建二值图
g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, ); // 显示原图
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
// 创建二值图窗口
cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE); // 滑动条
int nThreshold = ;
cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, , on_trackbar); on_trackbar(); cvWaitKey(); cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsBinaryTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&g_pGrayImage);
cvReleaseImage(&g_pBinaryImage);
return ;
}

输出:

【opencv入门篇】 10个程序快速上手opencv【上】

opencv入门篇·上完。

新手上路,希望老司机能多多指教:)

本文参考:

http://blog.csdn.net/morewindows/article/category/1291764

http://blog.csdn.net/timidsmile/article/details/6681668

上一篇:Hybrid App 和 React Native 开发那点事


下一篇:初识树莓派--刷机,登录,安装程序,文件传输