《学习openCV》例程解析 ex_8_2 (轮廓)
来源:互联网 发布:响应式博客模板知乎 编辑:程序博客网 时间:2024/06/06 03:57
例:根据滑动条参数检测轮廓,在滑动条变化时候重新检测
(2) 效果图
效果图:
/** Our Example 8-2 is drawn from the OpenCV package. Here we create a window with an image in it. A trackbar sets a simple threshold, and the contours in the thresholded im-age are drawn. The image is updated whenever the trackbar is adjusted.Example 8-2. Finding contours based on a trackbar’s location; the contours are updated whenever the trackbar is moved */#include "stdafx.h"#include "cv.h"#include "highgui.h"IplImage* g_img = NULL;IplImage* g_gray = NULL;int g_thresh = 100;CvMemStorage* g_storage = NULL;//内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等//动态增长数据结构的底层结构。void on_trackbar(int pos){if (g_storage == NULL){g_gray = cvCreateImage(cvGetSize(g_img), 8, 1);g_storage = cvCreateMemStorage();//创建内存块默认值为64K}else{cvClearMemStorage(g_storage);//清除储存块内容,并不释放内存}cvCvtColor(g_img, g_gray, CV_BGR2GRAY);//色彩空间转换, BGR到GRAYcvThreshold(g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY);//对数组元素进行固定阈值操作//该函数的典型应用是对灰度图像进行阈值操作得到二值图像。CvSeq* contours = 0;//可动态增长元素序列cvFindContours(//在二值图像中寻找轮廓 g_gray,//输入二值图像g_storage,//得到的轮廓的存储容器 &contours//指向第一个轮廓的指针);//coutours序列指针指向储存在g_storage 内存块中的轮廓cvZero(g_gray);//等于cvSetZero,清空图像if (contours)//如果序列非空{cvDrawContours(//在图像中绘制外部和内部的轮廓g_gray,contours,//指针指向第一个轮廓cvScalarAll(255),//g_gray 为单通道颜色,只有一种颜色cvScalarAll(255),//赋为白色100//绘制轮廓的最大等级,如果为0 单独绘制轮廓);cvShowImage("Contours", g_gray);}}int main(){cvNamedWindow("g_img", CV_WINDOW_AUTOSIZE);g_img = cvLoadImage("lena.jpg");cvShowImage("g_img", g_img);cvNamedWindow("Contours", CV_WINDOW_AUTOSIZE);cvCreateTrackbar( "Threshold",//滑块名字 "Contours",//滑块所在窗口名字 &g_thresh,//指定创建时的滑块位置 255,//滑块位置的最大值 on_trackbar//每次滑块位置被改变的时候,被调用函数的指针。//这个函数应该被声明为void Foo(int); //如果没有回调函数,这个值可以设为NULL。 );on_trackbar(0);//初始先调用一次,否者滑块变动时才显示cvWaitKey();cvDestroyAllWindows();cvReleaseImage(&g_img);cvReleaseImage(&g_gray);return 0;}
(2) 效果图
改进单独加颜色绘制轮廓
/**扩展8_2使每个轮廓都随机颜色 */#include "stdafx.h"#include "cv.h"#include "highgui.h"IplImage* g_img = NULL;IplImage* g_gray = NULL;int g_thresh = 100;CvMemStorage* g_storage = NULL;//内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等//动态增长数据结构的底层结构。void on_trackbar(int pos){if (g_storage == NULL){g_gray = cvCreateImage(cvGetSize(g_img), 8, 1);g_storage = cvCreateMemStorage();//创建内存块默认值为64K}else{cvClearMemStorage(g_storage);//清除储存块内容,并不释放内存}cvCvtColor(g_img, g_gray, CV_BGR2GRAY);//色彩空间转换, BGR到GRAYcvThreshold(g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY);//对数组元素进行固定阈值操作//该函数的典型应用是对灰度图像进行阈值操作得到二值图像。CvSeq* contours = 0;//可动态增长元素序列cvFindContours(//在二值图像中寻找轮廓 g_gray,//输入二值图像g_storage,//得到的轮廓的存储容器 &contours//指向第一个轮廓的指针);//coutours序列指针指向储存在g_storage 内存块中的轮廓cvZero(g_gray);//等于cvSetZero,清空图像IplImage* g_temp = cvCreateImage(cvGetSize(g_gray), 8, 3);//创建一个3通道图像,显示有颜色的轮廓cvZero(g_temp);for(; contours != 0; contours = contours->h_next){//因为要单独绘制轮廓,所以得用循环CvScalar color = CV_RGB(rand()&255, rand()&255, rand()&255);//随机取色cvDrawContours(//在图像中绘制外部和内部的轮廓g_temp,contours,//指针指向第一个轮廓color,color,0//单独绘制轮廓);}cvShowImage("Contours", g_temp);}int main(){cvNamedWindow("g_img", CV_WINDOW_AUTOSIZE);g_img = cvLoadImage("lena.jpg");cvShowImage("g_img", g_img);cvNamedWindow("Contours", CV_WINDOW_AUTOSIZE);cvCreateTrackbar( "Threshold",//滑块名字 "Contours",//滑块所在窗口名字 &g_thresh,//指定创建时的滑块位置 255,//滑块位置的最大值 on_trackbar//每次滑块位置被改变的时候,被调用函数的指针。//这个函数应该被声明为void Foo(int); //如果没有回调函数,这个值可以设为NULL。 );on_trackbar(0);//初始先调用一次,否者滑块变动时才显示cvWaitKey();cvDestroyAllWindows();cvReleaseImage(&g_img);cvReleaseImage(&g_gray);return 0;}
- 《学习openCV》例程解析 ex_8_2 (轮廓)
- 《学习openCV》例程解析 ex_8_3 (轮廓)
- 《学习openCV》例程解析 ex_9_1 (像素片段)
- 《学习openCV》例程解析 ex_9_2(背景减除)
- 《学习openCV》例程解析 ex_9_2(背景减除)
- OpenCV学习:轮廓
- 《学习openCV》例程解析 ex_9_3(codeBook模型实现背景减除)
- 《学习openCV》例程解析 ex_9_3_ex(codeBook + 连通净化)
- 《学习openCV》例程解析 ex_9_3_ex(codeBook + 连通净化)
- OpenCV中文网站例程——轮廓检测2
- OpenCV例子学习轮廓检测
- opencv学习_9 (轮廓提取)
- opencv学习笔记6:轮廓
- opencv学习_9 (轮廓提取)
- OpenCV学习笔记16-轮廓
- OpenCV中文网站例程——轮廓检测(只检测图像的外部轮廓)
- OpenCV中文网站例程——轮廓检测(能检测内外部轮廓)
- OpenCV中文网站例程——轮廓检测(能检测任意输入图像的轮廓)
- 通用C++内存池代码
- Web Service
- 使用9妹的注意事项
- 2.11 最近点对
- vmware Dos声卡驱动安装说明
- 《学习openCV》例程解析 ex_8_2 (轮廓)
- 一个malloc的crash问题
- 在Win2003系统远程桌面设置多连接数方法(转载)
- SQL查询递归
- 找不到
- poj 楼天成的男人八题系列 A New Stone Game 博弈问题
- 转换数据库时间字段格式函数
- 程序的悟透
- 千山独行-一个人的创业路(连载三)