您的位置:首页 > 运维架构

opencv 识别门的重心

2016-04-14 23:01 351 查看
#include "cv.h"#include "highgui.h"#include"iostream"using namespace std;void image_process(IplImage *image);int main( int argc, char** argv ){ IplImage *image=cvLoadImage("D:\\men2.png"); // image_process(image); int iLowH =65; int iHighH = 114; int iLowS
=113; int iHighS =239; int iLowV = 0; int iHighV = 255; IplImage* dst = cvCreateImage( cvGetSize(image), 8, 3 ); CvSeq* contour = 0; IplImage* result;result=cvCloneImage(image); CvMemStorage* storage2 = cvCreateMemStorage(); CvSeq* contour3 = NULL; CvMoments
moments; CvMat *region; CvPoint pt1,pt2; double m00 = 0, m10, m01, mu20, mu11, mu02, inv_m00; double a, b, c; int xc, yc; CvMemStorage* storage = cvCreateMemStorage(); CvSeq * circles=NULL; // Circle cir[6]; CvPoint P0; CvPoint CenterPoint; IplImage *hsv=cvCreateImage(cvGetSize(image),8,3);//给hsv色系的图像申请空间
IplImage *hue=cvCreateImage(cvGetSize(image),8,1); //色调 IplImage *saturation=cvCreateImage(cvGetSize(image),8,1);//饱和度 IplImage *value=cvCreateImage(cvGetSize(image),8,1);//亮度 IplImage *imgThresholded=cvCreateImage(cvGetSize(hue),8,1); cvNamedWindow("yuan",1);
cvCvtColor(image,hsv,CV_BGR2HSV);//将RGB色系转为HSV色系 cvShowImage("yuan",image); //cvShowImage("hsv",hsv); cvSplit(hsv, hue, 0, 0, 0 );//分离三个通道 cvSplit(hsv, 0, saturation, 0, 0 ); cvSplit(hsv, 0, 0, value, 0 ); int value_1=0; cvInRangeS( hsv, cvScalar(iLowH, iLowS,
iLowV), cvScalar(iHighH, iHighS, iHighV), imgThresholded ); cvNamedWindow("imgThresholded",1); cvShowImage("imgThresholded",imgThresholded); IplImage*pContourImg= cvCreateImage( cvGetSize(image), 8, 1 ); cvCopy(imgThresholded,pContourImg); cvNamedWindow("pContourImg",1);
cvShowImage("pContourImg",pContourImg); // 提取轮廓 int contour_num = cvFindContours(pContourImg, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); cvZero(dst); // 清空数组 CvSeq *_contour = contour; double maxarea = 10000; double minarea
= 10; int m = 0; for( ; contour != 0; contour = contour->h_next ) { double tmparea = fabs(cvContourArea(contour)); if(tmparea < minarea) { cvSeqRemove(contour, 0); // 删除面积小于设定值的轮廓 continue; } CvRect aRect = cvBoundingRect( contour, 0 ); if ((aRect.width/aRect.height)<1
cvseqremove="" contour="" 0="" continue="" if="" tmparea=""> maxarea) { maxarea = tmparea; } m++; // 创建一个色彩值 // CvScalar color = CV_RGB( 0, 0, 255 ); /* max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓 如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种 如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓
*/ // cvDrawContours(dst, contour, color, color, 0, 1, 8); //绘制外部和内部的轮廓 } contour = _contour; int count = 0; double tmparea=0; for(; contour != 0; contour = contour->h_next) { count++; tmparea = fabs(cvContourArea(contour)); if (tmparea >= maxarea) { CvScalar
color = CV_RGB( 0, 255, 0); cvDrawContours(dst, contour, color, color, -1, 1, 8); cout<<"222"<<endl;cout<<"面积为"<<tmparea<<endl;cout<<endl;CvRect aRect = cvBoundingRect( contour, 0 ); //找重心{CvPoint2D32f center = cvPoint2D32f(0, 0);int countOfPoint = 0;for(int
i = aRect.x; i < aRect.x + aRect.width; ++i){for(int j = aRect.y; j < aRect.y + aRect.height; ++j){if(*(image->imageData + image->widthStep * j + i) != 0){center.x += i;center.y += j;countOfPoint++;}}}center.x /= countOfPoint;center.y /= countOfPoint;cvCircle(dst,
cvPoint(center.x, center.y), 5, cvScalar(0, 255), 2);} } } printf("%f\r\n", tmparea );//CvRect aRect = cvBoundingRect( contmax, 0 );//cvSetImageROI( pContourImg,aRect); //显示图像 cvShowImage( "contour", dst ); cvShowImage( "result",result); cvSaveImage("contour.bmp",pContourImg);
cvWaitKey(0);//////// IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 ); // CvMemStorage* storage = cvCreateMemStorage(0); // CvSeq* contour = 0; // IplImage* result;// result=cvCloneImage(src);// cvThreshold( src, src,120, 255, CV_THRESH_BINARY );//二值化
// cvNamedWindow( "Source", 1 ); // cvShowImage( "Source", src ); // IplImage*pContourImg= cvCreateImage( cvGetSize(src), 8, 1 ); // cvCopy(src,pContourImg);//// // 提取轮廓 // int contour_num = cvFindContours(pContourImg, storage, &contour, sizeof(CvContour),
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // cvZero(dst); // 清空数组 // CvSeq *_contour = contour; // double maxarea = 10000; // double minarea = 10; // int m = 0; // for( ; contour != 0; contour = contour->h_next ) // { // // double tmparea = fabs(cvContourArea(contour));
// if(tmparea < minarea) // { // cvSeqRemove(contour, 0); // 删除面积小于设定值的轮廓 // continue; // } // CvRect aRect = cvBoundingRect( contour, 0 ); // if ((aRect.width/aRect.height)<1 cvseqremove="" contour="" 0="" continue="" if="" tmparea=""> maxarea) // { // maxarea
= tmparea; // } // m++; // // 创建一个色彩值 // // CvScalar color = CV_RGB( 0, 0, 255 ); // // /* max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓 // 如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种 // 如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓 */ // // cvDrawContours(dst,
contour, color, color, 0, 1, 8); //绘制外部和内部的轮廓 // } // contour = _contour; // int count = 0; double tmparea=0;// for(; contour != 0; contour = contour->h_next) // { // count++; // tmparea = fabs(cvContourArea(contour)); // if (tmparea >= maxarea) // { // CvScalar
color = CV_RGB( 0, 255, 0); // cvDrawContours(dst, contour, color, color, -1, 1, 8); // cout<<"222"<<endl;// cout<<"面积为"<<tmparea<<endl;// cout<<endl;//// CvRect aRect = cvBoundingRect( contour, 0 ); // //找重心// {// CvPoint2D32f center = cvPoint2D32f(0, 0);//
int countOfPoint = 0;// for(int i = aRect.x; i < aRect.x + aRect.width; ++i){// for(int j = aRect.y; j < aRect.y + aRect.height; ++j){// if(*(src->imageData + src->widthStep * j + i) != 0){// center.x += i;// center.y += j;// countOfPoint++;// }// }// }////
center.x /= countOfPoint;// center.y /= countOfPoint;// cvCircle(dst, cvPoint(center.x, center.y), 5, cvScalar(0, 255), 2);// }//////////////// } // } // printf("%f\r\n", tmparea );////CvRect aRect = cvBoundingRect( contmax, 0 );////cvSetImageROI( pContourImg,aRect);//
//显示图像// cvShowImage( "contour", dst );// cvShowImage( "result",result);// cvSaveImage("contour.bmp",pContourImg);// cvWaitKey(0);//// //销毁窗口// cvDestroyWindow( "src" );// cvDestroyWindow( "result" );// cvDestroyWindow( "contour" );// //释放图像// cvReleaseImage(
&src );// cvReleaseImage( &result );// cvReleaseImage( &pContourImg );// cvReleaseMemStorage(&storage); return 0;}//void image_process(IplImage *image) // { // // IplImage* dst = cvCreateImage( cvGetSize(image), 8, 3 ); // CvMemStorage* storage3 = cvCreateMemStorage(0);
// CvSeq* contour = 0; // // 提取轮廓 // int contour_num = cvFindContours(pContourImg, storage3, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // cvZero(dst); // 清空数组 // CvSeq *_contour = contour; // double maxarea = 100; // double minarea
= 10; // int m = 0; // for( ; contour != 0; contour = contour->h_next ) // { // // double tmparea = fabs(cvContourArea(contour)); // if(tmparea < minarea) // { // cvSeqRemove(contour, 0); // 删除面积小于设定值的轮廓 // continue; // } // CvRect aRect = cvBoundingRect(
contour, 0 ); // if ((aRect.width/aRect.height)<1 cvseqremove="" contour="" 0="" continue="" if="" tmparea=""> maxarea) // { // maxarea = tmparea; // } // m++; // // 创建一个色彩值 // // CvScalar color = CV_RGB( 0, 0, 255 ); // // /* max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓
// 如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种 // 如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓 */ // // cvDrawContours(dst, contour, color, color, 0, 1, 8); //绘制外部和内部的轮廓 // } // contour = _contour; // int count = 0; double tmparea=0; // for(; contour != 0;
contour = contour->h_next) // { // count++; // tmparea = fabs(cvContourArea(contour)); // if (tmparea >= maxarea) // { // CvScalar color = CV_RGB( 0, 255, 0); // cvDrawContours(dst, contour, color, color, -1, 1, 8); // cout<<"222"<<endl; // cout<<"面积为"<<tmparea<<endl;
// cout<<endl; // // CvRect aRect = cvBoundingRect( contour, 0 ); // //找重心 // { // CvPoint2D32f center = cvPoint2D32f(0, 0); // int countOfPoint = 0; // for(int i = aRect.x; i < aRect.x + aRect.width; ++i){ // for(int j = aRect.y; j < aRect.y + aRect.height;
++j){ // if(*(image->imageData + image->widthStep * j + i) != 0){ // center.x += i; // center.y += j; // countOfPoint++; // } // } // } // // center.x /= countOfPoint; // center.y /= countOfPoint; // cout<<"重心坐标为x:"<<center.x<<endl; // cout<<"重心坐标为y:"<<center.y<=1
// //pImg8u->height/15, //该参数是让算法能明显区分的两个不同圆之间的最小距离 // //80, //用于Canny的边缘阀值上限,下限被置为上限的一半 // //65, //累加器的阀值 // //25, //最小圆半径 // //50 //最大圆半径 // //); // } // // cvShowImage( "contour", dst ); // }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: