opencv 连通区域的最小外接矩形

#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <math.h>
//#include "otsu.h"


int main(int argc,char** argv)
{
	IplImage *src,*gray,*bw,*dst;
    CvMemStorage* storage=cvCreateMemStorage(0);
	CvSeq* contour=0;
	
	char* filename=argc==2?argv[1]:"5.jpg";
		
	if(!filename)
		printf("can't open the file:%d\n",filename); 
    
	src=cvLoadImage("D:\\xsz\\Debug\\图片\\3.jpg",1);

		cvNamedWindow("image",1);
		cvShowImage("image",src);

    gray=cvCreateImage(cvSize(src->width,src->height),src->depth,1);
	cvCvtColor(src,gray,CV_BGR2GRAY);
int hei,wid;
    hei=gray->height;//注意此处是gray,otsu中要用到hei,wid,已在otsu.h中全局定义;
	wid=gray->width;
	printf("图像的高为:%d,宽为:%d\n\n",hei,wid);

		cvNamedWindow("image2",1);
    	cvShowImage("image2",gray);


    bw=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
	     cvThreshold(gray,bw,128,255,CV_THRESH_BINARY_INV);

	
  		cvNamedWindow("image4",1);
		cvShowImage("image4",bw);

	//	wb=cvCloneImage(bw);	
    //  cvNot(bw,wb);  只有当目标区域为黑色背景时候,才对其取反。

		dst=cvCloneImage(src);
		cvFindContours(bw,storage,&contour,sizeof(CvContour),CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE);
 for(;contour!=0;contour=contour->h_next)

	{	CvBox2D rect=cvMinAreaRect2(contour,storage);

		CvPoint2D32f rect_pts0[4];
		cvBoxPoints(rect, rect_pts0);

//因为cvPolyLine要求点集的输入类型是CvPoint**
//所以要把 CvPoint2D32f 型的 rect_pts0 转换为 CvPoint 型的 rect_pts
//并赋予一个对应的指针 *pt
int npts = 4,k=0;
int aaa=0,bbb=0;
CvPoint rect_pts[4], *pt = rect_pts;

printf("连通区域最小外接矩形顶点坐标分别为:\n");
for (int i=0; i<4; i++)
{
	rect_pts[i]= cvPointFrom32f(rect_pts0[i]);
		printf("%d %d\n",rect_pts[i].x,rect_pts[i].y);
		aaa=(int)sqrt((pow((rect_pts[0].x-rect_pts[1].x),2)+pow((rect_pts[0].y-rect_pts[1].y),2)));
		bbb=(int)sqrt((pow((rect_pts[0].x-rect_pts[3].x),2)+pow((rect_pts[0].y-rect_pts[3].y),2)));

			if(aaa<bbb)
				{
					k=aaa;
					aaa=bbb;
					bbb=k;
				}

}
printf("最小外接矩形的长为:%d,宽为:%d。\n\n",aaa,bbb);

//chang=rect_pts[0]-rect_pts[3];
//kuan=rect_pts[0]-rect_pts[1];
//printf("最小外接矩形的长为:%d,宽为:%d\n",chang,kuan);
		
//画出Box
cvPolyLine(dst, &pt, &npts, 1, 1, CV_RGB(255,0,0), 1);
 }
	cvNamedWindow("image5",1);
		cvShowImage("image5",dst);

		cvWaitKey(0);//注意此句放的位置,放的不对则。。。
		
cvDestroyWindow("image");
cvDestroyWindow("image2");
cvDestroyWindow("image4");
cvDestroyWindow("image5");

cvReleaseImage(&src);
cvReleaseImage(&gray);
cvReleaseImage(&bw);
cvReleaseImage(&dst);
		
		return 0;
}


 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值