资源简介

刚学OPENCV时用来练习的一段小代码,刚进入OPENCV的可以参考下

资源截图

代码片段和文件信息

// 图像中的线段检测
#include 
using namespace std;
#pragma comment(linker “/subsystem:\“windows\“ /entry:\“mainCRTStartup\““)
IplImage *pCannyImage*pSrcImage;
//const char *pstrWindowsCannytitle = “边缘检测图“;
const char *pstrWindowsLineName = “线段检测“;
CvMemStorage *pcvMStorage;
IplImage *pColorImage;
//cvCreateTrackbar的回调函数
void on_trackbar(int threshold)//threshold 为阈值
{
//canny边缘检测
cvCanny(pSrcImagepCannyImagethresholdthreshold*33);
//cvShowImage(pstrWindowsCannytitlepCannyImage);
//cvSmooth(pCannyImage pCannyImage);
// 线段检测(只能针对二值图像)
pcvMStorage = cvCreateMemStorage();
double fRho = 1;
double fTheta = CV_PI / 180;
int nMaxLineNumber = 50;   //最多检测条直线
double fMinLineLen = 100;   //最小线段长度
double fMinLineGap = 10;   //最小线段间隔


CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage pcvMStorage CV_HOUGH_PROBABILISTIC fRho fTheta nMaxLineNumber fMinLineLen fMinLineGap);

// 绘制线段
pColorImage = cvCreateImage(cvGetSize(pSrcImage) IPL_DEPTH_8U 3);
cvCvtColor(pCannyImage pColorImage CV_GRAY2BGR);
int i;
for(i = 0; i < pcvSeqLines->total; i++)
{
CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines i);
cvLine(pColorImage line[0] line[1] CV_RGB(25500) 2);
}
cvShowImage(pstrWindowsLineName pColorImage);
}
int main()
{
const char *pstrWindowsSrctitle = “原图“;


// 从文件中加载原图
pSrcImage = cvLoadImage(“原图.jpg“ CV_LOAD_IMAGE_UNCHANGED);
// 灰度图
IplImage *pGrayImage =  cvCreateImage(cvGetSize(pSrcImage) IPL_DEPTH_8U 1);
cvCvtColor(pSrcImage pGrayImage CV_BGR2GRAY);
// 边缘图
pCannyImage = cvCreateImage(cvGetSize(pSrcImage) IPL_DEPTH_8U 1);
//cvCanny(pGrayImage pCannyImage 56 168);
//cvNamedWindow(pstrWindowsCannytitleCV_WINDOW_AUTOSIZE);
//Create Windows
cvNamedWindow(pstrWindowsSrctitle CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrctitle pSrcImage);
cvNamedWindow(pstrWindowsLineName CV_WINDOW_AUTOSIZE);

//Create TrackBar
const char *pstrWindowsToolBar = “Threshold“;
int nThresholdEdge = 1;
cvCreateTrackbar
(pstrWindowsToolBarpstrWindowsLineName&nThresholdEdge100on_trackbar);
//Show the Image
    on_trackbar(1);








cvWaitKey(0);

cvReleaseMemStorage(&pcvMStorage);
cvDestroyWindow(pstrWindowsSrctitle);
cvDestroyWindow(pstrWindowsLineName);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pCannyImage);
cvReleaseImage(&pColorImage);
return 0;
}
/*在《【OpenCV入门指南】第五篇轮廓检测上》与《【OpenCV入门指南】第六篇轮廓检测下》讲解了OpenCV的轮廓检测。本篇将讲解在OpenCV中使用线段检测与圆检测。

线段检测与圆检测主要运用Hough变换,Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线进行识别。

在OpenCV编程中,线段检测和圆检测已经封装成函数了,直接使用cvHoughLines2和cvHoughCircles即可,下面来看看函数介绍和实际代码。

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/863841

 

函数功能:检测图像中的线段

函数原型: 

CvSeq* cvHoughLines2( 

  CvArr* image 

  void* line_storage 

  int method

  double rho 

  double theta 

  int th

评论

共有 条评论