// 图像中的线段检测
//By MoreWindows (<img class="BDE_Image" src="http://blog.csdn.net/MoreWindows)</p><p>#include<opencv2/opencv.hpp></p><p>usingnamespacestd;</p><p>#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")</p><p>intmain()</p><p>{</p><p>constchar*pstrWindowsSrcTitle="原图(http://blog.csdn.net/MoreWindows)";</p><p>constchar*pstrWindowsLineName="线段检测";</p><p></p><p>//从文件中加载原图</p><p>IplImage*pSrcImage=cvLoadImage("201.jpg" unselectable="on" pic_type="1"/>
", CV_LOAD_IMAGE_UNCHANGED);
// 灰度图
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 边缘图
IplImage *pCannyImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCanny(pGrayImage, pCannyImage, 30, 90);
//cvSmooth(pCannyImage, pCannyImage);
// 线段检测(只能针对二值图像)
CvMemStorage *pcvMStorage = cvCreateMemStorage();
double fRho = 1;
double fTheta = CV_PI / 180;
int nMaxLineNumber = 50; //最多检测条直线
double fMinLineLen = 50; //最小线段长度
double fMinLineGap = 10; //最小线段间隔
CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap);
// 绘制线段
IplImage *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(255,0,0), 2);
}
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
cvNamedWindow(pstrWindowsLineName, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsLineName, pColorImage);
cvWaitKey(0);
cvReleaseMemStorage(&pcvMStorage);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsLineName);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pCannyImage);
cvReleaseImage(&pColorImage);
return 0;
}
运行这个程序 不小心把for循环上的cvtcolor里的CV_GRAY2BGR改为CV_BGR2GRAY
运行时就报错了 新人 不是很懂原因
//By MoreWindows (<img class="BDE_Image" src="http://blog.csdn.net/MoreWindows)</p><p>#include<opencv2/opencv.hpp></p><p>usingnamespacestd;</p><p>#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")</p><p>intmain()</p><p>{</p><p>constchar*pstrWindowsSrcTitle="原图(http://blog.csdn.net/MoreWindows)";</p><p>constchar*pstrWindowsLineName="线段检测";</p><p></p><p>//从文件中加载原图</p><p>IplImage*pSrcImage=cvLoadImage("201.jpg" unselectable="on" pic_type="1"/>
", CV_LOAD_IMAGE_UNCHANGED);
// 灰度图
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 边缘图
IplImage *pCannyImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCanny(pGrayImage, pCannyImage, 30, 90);
//cvSmooth(pCannyImage, pCannyImage);
// 线段检测(只能针对二值图像)
CvMemStorage *pcvMStorage = cvCreateMemStorage();
double fRho = 1;
double fTheta = CV_PI / 180;
int nMaxLineNumber = 50; //最多检测条直线
double fMinLineLen = 50; //最小线段长度
double fMinLineGap = 10; //最小线段间隔
CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap);
// 绘制线段
IplImage *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(255,0,0), 2);
}
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
cvNamedWindow(pstrWindowsLineName, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsLineName, pColorImage);
cvWaitKey(0);
cvReleaseMemStorage(&pcvMStorage);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsLineName);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pCannyImage);
cvReleaseImage(&pColorImage);
return 0;
}
运行这个程序 不小心把for循环上的cvtcolor里的CV_GRAY2BGR改为CV_BGR2GRAY
运行时就报错了 新人 不是很懂原因