Skip to content

Instantly share code, notes, and snippets.

@longbuilder
Created April 19, 2014 01:10
Show Gist options
  • Save longbuilder/11070438 to your computer and use it in GitHub Desktop.
Save longbuilder/11070438 to your computer and use it in GitHub Desktop.
opencv image segment
//转换为灰度图
IplImage* pGrayImage = cvLoadImage( "image0.bmp", 0);
//利用Canny算子进行边缘检测
IplImage * pCannyImg=cvCreateImage(cvGetSize(pGrayImage),pGrayImage->depth,1);
cvCanny(pGrayImage,pCannyImg,50,150,3);
//膨胀,使边缘轮廓闭合
IplImage * pDilateImg=cvCreateImage(cvGetSize(pGrayImage),pGrayImage->depth,1);
IplConvKernel *rect_2;
rect_2 = cvCreateStructuringElementEx(2, 3, 1, 1, CV_SHAPE_RECT);
cvDilate(pCannyImg, pDilateImg);
//检测图片轮廓
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contour = 0;
int mode = CV_RETR_EXTERNAL;
int num = cvFindContours(pDilateImg,storage,&contour,sizeof(CvContour),
CV_RETR_LIST,CV_CHAIN_APPROX_NONE, cvPoint(0,0) );
//用白色填充面积最大的轮廓
double maxArea = 2000;
IplImage* pContourImg = cvCreateImage(cvGetSize(pCannyImg), IPL_DEPTH_8U, 3);
//初始化为黑色
cvZero(pContourImg);
while(contour)
{
double area=fabs(cvContourArea(contour, CV_WHOLE_SEQ));
if(area > maxArea)
{
cvDrawContours(pContourImg,contour,cvScalarAll(255),cvScalarAll(0),0,CV_FILLED);
}
contour=contour->h_next;
}
cvReleaseMemStorage(&storage);
//填充图作为mask,与原图像进行按像素与操作
IplImage* pColorImage = cvLoadImage( "image0.bmp", -1);
for(int height=0; height{
for(int width = 0; width < 320; width++)
{
int piex = height*320+width;
if((BYTE)pContourImg->imageData[piex*3] != 255u)
{
pColorImage->imageData[piex*3] = 0;
pColorImage->imageData[piex*3+1] = 0;
pColorImage->imageData[piex*3+2] = 0;
}
}
}
//显示保存图像
cvShowImage( "output", pColorImage);
cvSaveImage("output.bmp", pColorImage);
//释放资源
cvReleaseImage(&pColorImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pCannyImg);
cvReleaseImage(&pDilateImg);
cvReleaseImage(&pContourImg);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment