OpenCV中文网站例程——轮廓检测(能检测任意输入图像的轮廓)
2014-03-28 22:12
531 查看
本文参考以下帖子http://blog.csdn.net/MoreWindows
对输入的任意彩图进行轮廓提取,通过调整二值化的阈值来改善轮廓的清晰度
效果如图:
代码如下:
//图像轮廓检测上
//参考MoreWindows (http://blog.csdn.net/MoreWindows)
//输入一任意的图像,通过控制阈值(如下面的100)来改善二值化效果,将彩图提取轮廓
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
using namespace std;
int main( int argc, char** argv )
{
const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsOutLineTitle = "轮廓图";
//创建图像
IplImage *pSrcImage =NULL;
pSrcImage = cvLoadImage( "E:\\Lena.jpg", 1);
// 显示原图
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
// 转换为灰度图
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 转换为二值图
IplImage *pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 1);
cvThreshold(pGrayImage, pBinaryImage, 100, 255, CV_THRESH_BINARY); //当前者输入数组大于阈值100时,输出数组为255,否则输出数组为0;二值化
// 检索轮廓并返回检测到的轮廓的个数
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
CvSeq *pcvSeq = NULL;
cvFindContours(pBinaryImage, pcvMStorage, &pcvSeq, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));//参数1为二值图像,参数2为存储容器
// 画轮廓图
IplImage *pOutlineImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3);
int nLevels = 5;
// 填充成白色
cvRectangle(pOutlineImage, cvPoint(0, 0), cvPoint(pOutlineImage->width, pOutlineImage->height), CV_RGB(255, 255, 255), CV_FILLED);
cvDrawContours(pOutlineImage, pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), nLevels, 2);
// 显示轮廓图
cvNamedWindow(pstrWindowsOutLineTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsOutLineTitle, pOutlineImage);
cvReleaseMemStorage(&pcvMStorage);
cvWaitKey(0);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsOutLineTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pBinaryImage);
cvReleaseImage(&pOutlineImage);
return 0;
}
输入图像换做规整的几何图时效果如下:(注:此时二值化阈值的100改为250)
对输入的任意彩图进行轮廓提取,通过调整二值化的阈值来改善轮廓的清晰度
效果如图:
代码如下:
//图像轮廓检测上
//参考MoreWindows (http://blog.csdn.net/MoreWindows)
//输入一任意的图像,通过控制阈值(如下面的100)来改善二值化效果,将彩图提取轮廓
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
using namespace std;
int main( int argc, char** argv )
{
const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsOutLineTitle = "轮廓图";
//创建图像
IplImage *pSrcImage =NULL;
pSrcImage = cvLoadImage( "E:\\Lena.jpg", 1);
// 显示原图
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
// 转换为灰度图
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 转换为二值图
IplImage *pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 1);
cvThreshold(pGrayImage, pBinaryImage, 100, 255, CV_THRESH_BINARY); //当前者输入数组大于阈值100时,输出数组为255,否则输出数组为0;二值化
// 检索轮廓并返回检测到的轮廓的个数
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
CvSeq *pcvSeq = NULL;
cvFindContours(pBinaryImage, pcvMStorage, &pcvSeq, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));//参数1为二值图像,参数2为存储容器
// 画轮廓图
IplImage *pOutlineImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3);
int nLevels = 5;
// 填充成白色
cvRectangle(pOutlineImage, cvPoint(0, 0), cvPoint(pOutlineImage->width, pOutlineImage->height), CV_RGB(255, 255, 255), CV_FILLED);
cvDrawContours(pOutlineImage, pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), nLevels, 2);
// 显示轮廓图
cvNamedWindow(pstrWindowsOutLineTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsOutLineTitle, pOutlineImage);
cvReleaseMemStorage(&pcvMStorage);
cvWaitKey(0);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsOutLineTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pBinaryImage);
cvReleaseImage(&pOutlineImage);
return 0;
}
输入图像换做规整的几何图时效果如下:(注:此时二值化阈值的100改为250)
相关文章推荐
- OpenCV中文网站例程——轮廓检测(只检测图像的外部轮廓)
- OpenCV中文网站例程——轮廓检测2
- OpenCV中文网站例程——轮廓检测(能检测内外部轮廓)
- OpenCV中文网站例程——图像创建、保存和复制
- OpenCV中文网站例程——读视频文件和运动物体检测
- OpenCV中文网站例程——图像颜色分布直方图
- OpenCV中文网站例程——Canny边缘检测(带滚动条)
- OpenCV中文网站例程——Hough线段检测
- OpenCV中文网站例程——图像旋转和缩放
- OpenCV中文网站例程——鼠标绘图,图像修复
- OpenCV中文网站例程——Canny边缘检测
- OPENCV图像轮廓检测
- OpenCV中文网站例程——直线拟合cvFitline
- OpenCV中文网站例程——仿射变换
- Python-OpenCV 处理图像:图像中边界和轮廓检测
- Python-OpenCV 处理图像(四)(五):图像直方图和反向投影 图像中边界和轮廓检测
- OpenCV中文网站例程——单目标模板匹配
- opencv 实现对摄像头输入图像中文件及证件等的实时跟踪,四边形检测及提取
- OpenCV中文网站例程——多目标模板匹配
- OpenCV之图像轮廓检测及提取