logo资料库

opencv利用掩码实现逼真贴图 去除白背景.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
#include "highgui.h" #include "cv.h" int main() { 像。 //载入待处理图像 IplImage *img=cvLoadImage("panda.jpg"); IplImage *back=cvLoadImage("Airplane.jpg"); if(!img && !back) return -1; //创建纯白背景,熊猫图像的灰度图 IplImage *wback=cvCreateImage(cvSize(img->width,img->height),img->depth,1); IplImage *img_gray=cvCreateImage(cvSize(img->width,img->height),img->depth,1); IplImage *diff=cvCreateImage(cvSize(img->width,img->height),img->depth,1); cvZero(wback); cvAddS(wback,cvScalar(255),wback); cvCvtColor(img,img_gray,CV_RGB2GRAY); //作纯白背景与熊猫图像灰度图的差,并对得到的灰度图像进行阈值操作得到二值图 cvAbsDiff(img_gray,wback,diff); cvThreshold(diff,diff,5,255,CV_THRESH_BINARY); //用漫水填充法进一步去噪,以得到更加清晰的掩码 double area=0; CvRect rect; CvPoint point,point_max; CvConnectedComp comp; diff->origin=0; for(int j=0;j<=diff->height;j++) { uchar *ptr=(uchar*)diff->imageData+j*diff->widthStep; for(int i=0;i<=diff->width;i++) { if (ptr[i]==255) { ptr[i]==0; break; if (i==diff->width|j==diff->height|i==0|j==0) { } point=cvPoint(i,j); cvFloodFill(diff,point,cvScalar(100),cvScalar(15),cvScalar(15),&comp,4,0); if(area==0) { point_max=point;
area=comp.area; rect=comp.rect; } } cvFloodFill(diff,point,cvScalar(0),cvScalar(15),cvScalar(15),&comp,4,0); cvSetImageROI(diff,rect); cvAddS(diff,cvScalar(155),diff); cvResetImageROI(diff); area=comp.area; rect=comp.rect; point_max=point; } else if(comp.area>=area) { } else { } //cvShowImage("mask",diff); //cvWaitKey(0); std::cout<width,img->height); cvSetImageROI(back,b_rect); cvCopy(img,back,diff); cvResetImageROI(back); //显示原始熊猫图,掩码,带有熊猫头的背景图 cvNamedWindow("img"); cvNamedWindow("diff"); cvNamedWindow("back"); cvShowImage("img",img); cvShowImage("diff",diff); cvShowImage("back",back); cvWaitKey(0); //释放内存,关闭窗口 cvReleaseImage(&img); cvReleaseImage(&back); cvReleaseImage(&wback); cvReleaseImage(&img_gray); cvReleaseImage(&diff); cvDestroyAllWindows();
return 0; }
分享到:
收藏