距离变换

xiaoxiao2021-02-27  221

#include <cv.h> #include <highgui.h> int main() { char* filename = "cs.jpg"; IplImage* src_image = cvLoadImage(filename,1); if(!src_image) return -1; cvNamedWindow("src"); CvSize size = cvGetSize(src_image); IplImage* gray_image = cvCreateImage(size,8,1); cvCvtColor(src_image,gray_image,CV_BGR2GRAY); IplImage* dist_image = cvCreateImage(size,32,1); IplImage* bi_src = cvCreateImage(size,8,1); IplImage* dist8u_image = cvCreateImage(size,8,1); IplImage* bi_dist = cvCreateImage(size,8,1); //原图像二值化 cvThreshold(gray_image,bi_src,100,255,CV_THRESH_BINARY); //距离变换 cvDistTransform(bi_src,dist_image,CV_DIST_L2,3,0,0); //找最大值 double max; cvMinMaxLoc(dist_image,0,&max,0,0); cvCvtScale(dist_image,dist8u_image,255./max); cvShowImage("dist8u_image",dist8u_image);//这一句我自己加的,显示出我们想要看到的距离变换之后的图像 //对距离图像二值化,去除手指部分 cvThreshold(dist8u_image,bi_dist,80,255,CV_THRESH_BINARY); //求重心 float s=0.0, x=0.0, y=0.0; uchar* data = (uchar*)bi_dist->imageData; int step = bi_dist->widthStep; for(int h=0;h<bi_dist->height;h++) for(int w=0;w<bi_dist->width;w++) if(255 == data[step*h+w]) { x += w; y += h; s++; } if(s>0) { x = x/s; y = y/s; } CvPoint pos = cvPoint((int)x,(int)y); cvCircle(src_image,pos,3,CV_RGB(255,0,0),1,CV_AA); cvShowImage("src",src_image); cvWaitKey(-1); cvDestroyWindow("src"); cvReleaseImage(&src_image); cvReleaseImage(&gray_image); cvReleaseImage(&bi_src); cvReleaseImage(&dist8u_image); cvReleaseImage(&bi_dist); return 0; }
转载请注明原文地址: https://www.6miu.com/read-13838.html

最新回复(0)