导言:本系列博客目的在于可以在vs快速上手opencv,理论知识涉及较少,你们有兴趣能够查阅其余博客深刻了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:)html
PS:官方文档永远是最好的入门资料,逐步提升英文阅读能力也很重要:)windows
官方文档传送门:函数
【英】http://www.docs.opencv.org/2.4.6/#学习
【中】http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.htmlui
环境配置:http://www.cnblogs.com/always-chang/p/6170222.htmlspa
学习笔记思惟导图:.net
1 #include "highgui.h" 2 3 int main(int argc, char** argv) 4 { 5 const char *imgpath = "opencv.jpg"; 6 IplImage *img = cvLoadImage(imgpath);//加载图像文件至内存 7 cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);//建立一个名为Example1的窗口 8 cvShowImage("Example1", img);//显示图像 9 cvWaitKey(0);//等待用户触发按键 10 cvReleaseImage(&img);//释放图片占用的内存 11 cvDestroyWindow("Example1");//销毁窗口 12 13 return 0; 14 }
注意:图像在主函数所在文件夹。3d
运行结果:code
主要函数介绍htm
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等等。
第三个参数表示图像的通道数
1 #include <opencv2/opencv.hpp> 2 using namespace std; 3 //隐藏控制台窗口 4 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 5 int main() 6 { 7 const char *pstrImageName = "cyh.jpg"; 8 const char *pstrSaveImageName = "cyh缩放图.jpg"; 9 const char *pstrWindowsSrcTitle = "原图"; 10 const char *pstrWindowsDstTitle = "缩放图"; 11 12 double fScale = 0.5; //缩放倍数 13 CvSize czSize; //目标图像尺寸 14 15 //从文件中读取图像 16 IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED); 17 IplImage *pDstImage = NULL; 18 19 //计算目标图像大小 20 czSize.width = pSrcImage->width * fScale; 21 czSize.height = pSrcImage->height * fScale; 22 23 //建立图像并缩放 24 pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels); 25 cvResize(pSrcImage, pDstImage, CV_INTER_AREA); 26 27 //建立窗口 28 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); 29 cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE); 30 31 //在指定窗口中显示图像 32 cvShowImage(pstrWindowsSrcTitle, pSrcImage); 33 cvShowImage(pstrWindowsDstTitle, pDstImage); 34 35 //等待按键事件 36 cvWaitKey(); 37 38 //保存图片 39 cvSaveImage(pstrSaveImageName, pDstImage); 40 41 cvDestroyWindow(pstrWindowsSrcTitle); 42 cvDestroyWindow(pstrWindowsDstTitle); 43 cvReleaseImage(&pSrcImage); 44 cvReleaseImage(&pDstImage); 45 return 0; 46 }
输出:
主要函数介绍
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位置的数值。
1 #include <opencv2/opencv.hpp> 2 using namespace std; 3 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 4 5 IplImage *g_pSrcImage, *g_pCannyImg; 6 const char *pstrWindowsCannyTitle = "边缘检测图"; 7 //cvCreateTrackbar的回调函数 8 void on_trackbar(int threshold) 9 { 10 //canny边缘检测 11 cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3); 12 cvShowImage(pstrWindowsCannyTitle, g_pCannyImg); 13 } 14 int main() 15 { 16 const char *pstrImageName = "cyh.jpg"; 17 const char *pstrWindowsGrayTitle = "灰度图"; 18 const char *pstrWindowsToolBar = "Threshold"; 19 20 //从文件中载入图像的灰度图CV_LOAD_IMAGE_GRAYSCALE - 灰度图 21 g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE); 22 g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1); 23 24 //建立窗口 25 cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE); 26 cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE); 27 28 //建立滑动条 29 int nThresholdEdge = 1; 30 cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 100, on_trackbar); 31 32 //在指定窗口中显示图像 33 cvShowImage(pstrWindowsGrayTitle, g_pSrcImage); 34 on_trackbar(1); 35 36 //等待按键事件 37 cvWaitKey(); 38 39 cvDestroyWindow(pstrWindowsGrayTitle); 40 cvDestroyWindow(pstrWindowsCannyTitle); 41 cvReleaseImage(&g_pSrcImage); 42 cvReleaseImage(&g_pCannyImg); 43 return 0; 44 }
输出:
【多说几句】灰度图像和二值图像
灰度图像:从一个通道进行采样获得的图像,这类图像一般显示为从最暗黑色到最亮的白色的灰度(0~255)。灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特色是亮度由暗到明,变化是连续的。
使用灰度图的好处:
①RGB的值都同样。
②图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。
③由于是256色调色板,因此图像数据中一个字节表明一个像素,很整齐。
二值图像:图像的二值化是将图像上的像素点的灰度值设置为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 */
};
1 #include <opencv2/opencv.hpp> 2 using namespace std; 3 4 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 5 6 IplImage *g_pGrayImage = NULL; 7 IplImage *g_pBinaryImage = NULL; 8 const char *pstrWindowsBinaryTitle = "二值图"; 9 10 void on_trackbar(int pos) 11 { 12 // 转为二值图 13 cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY); 14 // 显示二值图 15 cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage); 16 } 17 18 int main(int argc, char** argv) 19 { 20 const char *pstrWindowsSrcTitle = "原图"; 21 const char *pstrWindowsToolBarName = "二值图阈值"; 22 23 // 从文件中加载原图 24 IplImage *pSrcImage = cvLoadImage("cyh.jpg", CV_LOAD_IMAGE_UNCHANGED); 25 26 // 转为灰度图 27 g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); 28 cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY); 29 30 // 建立二值图 31 g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1); 32 33 // 显示原图 34 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); 35 cvShowImage(pstrWindowsSrcTitle, pSrcImage); 36 // 建立二值图窗口 37 cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE); 38 39 // 滑动条 40 int nThreshold = 1; 41 cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 100, on_trackbar); 42 43 on_trackbar(1); 44 45 cvWaitKey(0); 46 47 cvDestroyWindow(pstrWindowsSrcTitle); 48 cvDestroyWindow(pstrWindowsBinaryTitle); 49 cvReleaseImage(&pSrcImage); 50 cvReleaseImage(&g_pGrayImage); 51 cvReleaseImage(&g_pBinaryImage); 52 return 0; 53 }
输出:
opencv入门篇·上完。
新手上路,但愿老司机能多多指教:)
本文参考: