?? colormodelycbcr.cpp
字號:
#ifdef _CH_
#define WIN32
#error "The file needs cvaux, which is not wrapped yet. Sorry"
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
#include <cvaux.h>
#include <fstream.h>
#include <limits>
#endif
#ifdef _EiC
#define WIN32
#endif
#ifdef _WIN32
/* use clock() function insted of time() */
#define time( arg ) (((double) clock()) / CLOCKS_PER_SEC)
#endif /* _WIN32 */
#ifndef PATH_MAX
#define PATH_MAX 512
#endif /* PATH_MAX */
void main( int argc, char** argv )
{
int i,j;
// int s = 0; //計算總的象素點數
// int n = 0;
//
// FILE* info;
// char* infoname;
// char fullname[PATH_MAX];
// //char detfilename[PATH_MAX];
// char* filename;
// //char detname[] = "";
//
// int num;
//
CvMat *M_Cov = cvCreateMat( 2, 2, CV_64FC1 );
CvMat *M_U = cvCreateMat( 2, 1, CV_64FC1 );
CvMat *T_Cov = cvCreateMat( 2, 2, CV_64FC1 );//協方差的逆
//
// for( i = 1; i < argc; i++ )
// {
// if( !strcmp( argv[i], "-info" ) )
// {
// infoname = argv[++i];
// }
// else if( !strcmp( argv[i], "-num" ) )
// {
// num = (int) atof( argv[++i] );
// }
// }
//
// strcpy( fullname, infoname );
// filename = strrchr( fullname, '\\' );
// if( filename == NULL )
// {
// filename = strrchr( fullname, '/' );
// }
// if( filename == NULL )
// {
// filename = fullname;
// }
// else
// {
// filename++;
// }
//
// info = fopen( infoname, "r" );
// if ( info != NULL)
// {
//
// //unsigned char R8,B8,G8; //0~255
// //float R,B,G, r,g,b;
// //int rr,bb,gg;
// unsigned char Y,Cb,Cr;
//
double U[2]={0};//均值
double Cov[2][2]={0};//協方差
//
// float Cb_Cr[256][256]={0};
// float p_CbCr[256][256]={0};
// float cb[256]={0};
// float cr[256]={0};
// float p_cb[256]={0};
// float p_cr[256]={0};
// IplImage* image = NULL;
// IplImage* Y_image = NULL;
//
// while ( !feof( info ))
// {
// if ( fscanf( info, "%s", filename) != 1 )
// break;
// image = cvLoadImage( fullname );//從文件中讀入一幅圖像
// if( !image )
// continue;
//
// s = s+image->height*image->width;
// n += 1;
//
// //把圖像由RGB空間轉換到YCbCr空間中
// IplImage* Y_image = cvCreateImage( cvGetSize(image),IPL_DEPTH_8U, 3 );//若為IPL_DEPTH_32F則報錯
// cvCvtColor(image, Y_image, CV_RGB2YCrCb);
//
// //讀取CbCr的值
// for ( i = 0; i < Y_image->height; i ++ )
// {
// for ( j = 0; j < Y_image->width; j ++ )
// {
// Y = (uchar) (*( Y_image->imageData + Y_image->widthStep*i+j*3 ));
// Cb = (uchar) (*( Y_image->imageData + Y_image->widthStep*i+j*3+1 ));
// Cr = (uchar) (*( Y_image->imageData + Y_image->widthStep*i+j*3+2 ));
//
// //二維直方圖(b,g)
// Cb_Cr[Cb][Cr]+=1;
// cb[Cb]+=1;
// cr[Cr]+=1;
// }
// }
// }
// //每一級的概率
// for( i=0;i<256;i++ )
// {
// for(j=0;j<256;j++)
// {
// p_CbCr[i][j]=Cb_Cr[i][j]/s;
// }
// }
// for(i=0;i<256;i++)
// {
// p_cb[i]=cb[i]/s;
// p_cr[i]=cr[i]/s;
// }
//
// //二維統計值方圖的均值
// for(i=0;i<256;i++)
// {
// U[0]=U[0]+i*p_cb[i];
// U[1]=U[1]+i*p_cr[i];
//
// //二維統計值方圖的協方差
// Cov[0][0] += i*i*p_cb[i];
// Cov[1][1] += i*i*p_cr[i];
// }
//
// Cov[0][0]=Cov[0][0]-U[0]*U[0];
// Cov[1][1]=Cov[1][1]-U[1]*U[1];
// for(i=0;i<256;i++)
// {
// for(j=0;j<256;j++)
// {
// Cov[0][1] += i*j*p_CbCr[i][j];
// }
// }
// Cov[0][1]=Cov[0][1]-U[0]*U[1];
// Cov[1][0]=Cov[0][1];
//
Cov[0][0]=55.3961;
Cov[0][1]=-36.4732;
Cov[1][0]=-36.4732;
Cov[1][1]=60.4410;
U[0]=112.0816;
U[1]=148.8160;
cvInitMatHeader( M_Cov, 2, 2, CV_64FC1, Cov);//數組變為矩陣
cvInitMatHeader( M_U, 2, 1, CV_64FC1, U);//數組變為矩陣
cvInvert( M_Cov, T_Cov, CV_LU); //用高斯消去法求逆矩陣,并存在T_Cov中
IplImage* Test_image = NULL;
IplImage* Test_image1 = NULL;
double X[2];
CvMat *M_X = cvCreateMat( 2, 1, CV_64FC1 );//Creates new matrix,the pointer to the matrix is M_X
CvMat *Sub_XU = cvCreateMat( 2, 1, CV_64FC1 );
CvMat *T_Sub_XU = cvCreateMat( 1, 2, CV_64FC1 );
CvMat *temp = cvCreateMat( 1, 2, CV_64FC1 );
CvMat *D = cvCreateMat( 1, 1, CV_64FC1 );
//CString img=2.jpg;
Test_image = Test_image1 = cvLoadImage("39.jpg" );//從文件中讀入一幅圖像
IplImage* Test_Y_image = cvCreateImage( cvGetSize(Test_image),IPL_DEPTH_8U, 3 );//Creates header and allocates data
IplImage* B_image = cvCreateImage( cvGetSize(Test_image),IPL_DEPTH_8U, 1 );
cvCvtColor(Test_image, Test_Y_image, CV_RGB2YCrCb);//Converts image from RGB space to YCbCr
for ( i = 0; i < Test_Y_image->height; i ++ )
{
for ( j = 0; j < Test_Y_image->width; j ++ )
{
X[0] = (uchar) (*( Test_Y_image->imageData + Test_Y_image->widthStep*i+j*3+1 ));//Cb
//char *imageData; /* pointer to aligned image data */
//int widthStep; /* size of aligned image row in bytes */
X[1] = (uchar) (*( Test_Y_image->imageData + Test_Y_image->widthStep*i+j*3+2 ));//Cr
cvInitMatHeader( M_X, 2, 1, CV_64FC1, X);//數組變為矩陣
//求馬氏距離
cvSub(M_X,M_U,Sub_XU);//Computes per-element difference between two arrays
cvTranspose( Sub_XU, T_Sub_XU );//轉置
cvMatMul( T_Sub_XU, T_Cov, temp);
cvMatMul( temp, Sub_XU, D);
//double d = CV_MAT_ELEM(*D,double,0,0);
if (CV_MAT_ELEM(*D,double,0,0)<=8.0)
*( B_image->imageData + B_image->widthStep*i+j)=255;
else
*( B_image->imageData + B_image->widthStep*i+j)=0;
}
}
cvNamedWindow( "binaryimage", CV_WINDOW_AUTOSIZE );
cvShowImage( "binaryimage", B_image );
cvWaitKey(10);//顯示窗口并停留一段時間
//cvvSaveImage( "binaryimage.jpg", B_image );
//形態學濾波
int size = 3;
IplConvKernel* Element = cvCreateStructuringElementEx( size, size, 0, 0,CV_SHAPE_ELLIPSE);
//cvErode( B_image, B_image, Element, 1 );
//cvDilate( B_image, B_image, Element, 1 );
cvMorphologyEx( B_image, B_image, NULL , Element, CV_MOP_OPEN, 2 );
cvNamedWindow( "Morphology", CV_WINDOW_AUTOSIZE );
cvShowImage( "Morphology", B_image );
cvWaitKey(1000);//顯示窗口并停留一段時間
// Find ellipes in input_img by using its edge information
// and draw the found ellipes on the images
//void FindCircles(IplImage* input_img, IplImage* input_edge, CvBox2D* box2DArray, int* pEllipseNum)
//{
// DO SOME DECLARARTIONS
// FOR ALL TYPES "Cv.." LOOK AT OPENCV-DOC !!
//橢圓擬合
CvMemStorage *storage;//Growing memory storage
int header_size, count;
CvSeq *contour;//Growable sequence of elements
CvSeq MyContour;
CvBox2D * myBox;
CvBox2D* box2DArray;
CvPoint *PointArray;
CvPoint2D32f *PointArray32f;
double MyContourArea;
int pEllipseNum = 0;
// ALLOCATE SOME MEMORY
myBox= (CvBox2D *) malloc(sizeof(CvBox2D));
box2DArray= (CvBox2D *) malloc(sizeof(CvBox2D));
header_size = sizeof(CvContour);
storage = cvCreateMemStorage (0); // For FindContours.
//THIS FUNCTION SEPARATES ALL CONTOURS
// LOOK AT THE DOC !!!! AGAIN
cvFindContours (B_image , storage, &contour, header_size, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
// GO THROUGH ALL CONTOURS
while(contour!=NULL)
{
if(CV_IS_SEQ_CURVE(contour))
{
// HOW MANY POITS HAS THE CONTOUR ??
count = contour ->total;
//ALLOC MEM
PointArray = (CvPoint *)malloc(count * sizeof(CvPoint));
//COPY THE POINTS TO A ARRAY
cvCvtSeqToArray(contour, PointArray, CV_WHOLE_SEQ);
// ALLOC MEM
PointArray32f = (CvPoint2D32f *) malloc((count + 1) * sizeof(CvPoint2D32f));
//CONVERT THE ARRAY TO A 2ND (32FLOAT)
// THIS WE NEED FOR cvFitELLIPSE
for (i=0; i<count-1; i++)
{
PointArray32f[i].x = (float)(PointArray[i].x);
PointArray32f[i].y = (float)(PointArray[i].y);
}
PointArray32f[i].x = (float)(PointArray[0].x);
PointArray32f[i].y = (float)(PointArray[0].y);
//cvFITELLIPSE NEEDS MIN. 6 POINTS
if (count >= 7)
{
memcpy(&MyContour,contour,sizeof(CvSeq));
MyContour.h_next=NULL;
MyContour.h_prev=NULL;
MyContourArea = fabs(cvContourArea(&MyContour,CV_WHOLE_SEQ));
//FOR DEBUGGING YOU CAN DRAW THE CONTOUR
//cvDrawContours(Test_image, contour, CV_RGB(255,0,0), CV_RGB(0,255,0),0);
//cvNamedWindow( "DrawContours", CV_WINDOW_AUTOSIZE );
//cvShowImage( "DrawContours", Test_image );
//cvWaitKey(100);
//FIND THE BEST FITTING ELLIPSE INTHIS CONTOUR
cvFitEllipse(PointArray32f, count, myBox);
//double sizeContour = fabs(cvContourArea(contour,CV_WHOLE_SEQ));
double ellipseArea = (double)(CV_PI*myBox->size.height*myBox->size.width/4);
float lwb=0;//The ratio of
// IS THE ELLIPSE INSIDE THE IMAGE ??
// Is it large enough?
if ((myBox->center.x > 0) && (myBox->center.y >0) && (ellipseArea>100))// && (ellipseArea<20000))
{
box2DArray[pEllipseNum].angle = myBox->angle;
box2DArray[pEllipseNum].center.x = myBox->center.x;
box2DArray[pEllipseNum].center.y = myBox->center.y;
box2DArray[pEllipseNum].size.height = myBox->size.height;
box2DArray[pEllipseNum].size.width = myBox->size.width;
box2DArray[pEllipseNum].angle = myBox->angle;
pEllipseNum++; // one ellipse was found
}
}
free(PointArray32f );
free(PointArray );
}
// GOT TO THE NEXT CONTOUR (IF ANY)
contour = contour->h_next;
}
//free (myBox);
free (contour);
cvReleaseMemStorage(&storage);
for ( i=0; i<pEllipseNum; i++)
{
CvPoint center;
center.x = (int) box2DArray[i].center.x;
center.y = (int) box2DArray[i].center.y;
CvSize size;
size.width = (int)box2DArray[i].size.width/2;
size.height = (int)box2DArray[i].size.height/2;
//DRAW THE ELLIPSE
cvEllipse(Test_image1, center, size, box2DArray[i].angle, 0, 360, CV_RGB(0,0,255),1);
}
cvNamedWindow( "Detect Result", CV_WINDOW_AUTOSIZE );
cvShowImage("Detect Result", Test_image);
cvvSaveImage( "39.jpg", Test_image1 );
cvWaitKey(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -