그림 일치 의 정규 화 적 관련 그 레이스 케 일 일치

4389 단어 opencv영상 처리
귀 일화 적 관련 은 전형 적 인 그 레이스 케 일 관련 알고리즘 으로 비례 인자 오차 의 영향 을 받 지 않 고 백색 소음 방해 에 강 한 장점 을 가진다.
그것 이 사용 하 는 유사 성 도량 정 의 는 다음 과 같다.
R 은 유사 성의 측정 값 으로 이 값 이 클 수록 유사 성 이 크다 는 뜻 이다.T 는 템 플 릿 이 고 S 는 검색 그림 입 니 다.템 플 릿 그림 T 를 검색 그림 S 위 에 놓 고 평평 하 게 이동 합 니 다. 템 플 릿 이 덮 인 검색 그림 은 Sij 라 고 합 니 다. (i, j) 은 이 하위 그림 의 왼쪽 상단 에 S 그림 에 있 는 좌 표를 참고 점 이 라 고 합 니 다.식 에서 분자 위치의 항목 은 서브 이미지 와 템 플 릿 의 상호 관련 이 고 (i, j) 의 변화 에 따라 달라 진다. 분모 의 두 번 째 항목 은 템 플 릿 의 총 에 너 지 를 나타 내 고 첫 번 째 항목 은 서브 맵 S 의 총 에 너 지 를 나타 낸다.T 가 Sij 와 일치 할 때 R 은 최대 값 입 니 다.
저 는 opencv 로 VS 2008 에서 프로그램 을 만 들 었 습 니 다. 프로그램 은 다음 과 같 습 니 다.
#include "stdafx.h"
 
#include <opencv2/opencv.hpp>
#include "highgui.h"
#include <math.h>

IplImage *src_gray1, *src_gray2, *src_gray3;
IplImage *T_gray1, *T_gray2, *T_gray3;
IplImage* S_img,*Match_image;

void AllocateImage(IplImage* I,IplImage* T)   //       
{
	CvSize sz   = cvGetSize(I);
	CvSize sz_T = cvGetSize(T);
	

	src_gray1 = cvCreateImage( sz, IPL_DEPTH_8U, 1);    //       
	src_gray2 = cvCreateImage( sz, IPL_DEPTH_8U, 1);
	src_gray3 = cvCreateImage( sz, IPL_DEPTH_8U, 1);

	T_gray1 = cvCreateImage( sz_T, IPL_DEPTH_8U, 1);	//       
	T_gray2 = cvCreateImage( sz_T, IPL_DEPTH_8U, 1);
	T_gray3 = cvCreateImage( sz_T, IPL_DEPTH_8U, 1);

	S_img   = cvCreateImage( sz_T, IPL_DEPTH_8U, 1);	//        
	Match_image = cvCreateImage( sz, IPL_DEPTH_8U, 1);  //     ,              

	cvSetZero(Match_image);
}
int main(int argc, char* argv[])
{
	
	IplImage* img = cvLoadImage("image/   .bmp");                 //          
	IplImage* T_img = cvLoadImage("image/     .bmp");			 //   
	int i,j,m,n,Max_width,Max_height;
	double MatchValue=0,MaxValue=0;
	unsigned int src_width  = img->width;
	unsigned int src_height = img->height;
	unsigned int T_width  = T_img->width;
	unsigned int T_height = T_img->height;
	unsigned long InterRelateValue=0, S_energy=0, T_energy=0;
	
	AllocateImage( img, T_img);
	 
	
	cvNamedWindow("my picture",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("my model",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("result",CV_WINDOW_AUTOSIZE);

	cvSplit( img, src_gray1, src_gray2, src_gray3, 0);
	cvSplit( T_img, T_gray1, T_gray2, T_gray3, 0);
	
	for( i= 0; i<(src_height-T_height); i++)        //          
	{
		for( j= 0; j<(src_width-T_width); j++)
		{
			
			cvSetImageROI(src_gray1,                
			cvRect( j, i, T_img->width, T_img->height )		
			);
			cvCopy( src_gray1, S_img, 0 );
			cvResetImageROI(src_gray1);
			///////////////////////////////////////////     
			for( m=0; m<T_height; m++)
			{
				unsigned char* S_ptr = (unsigned char*)S_img->imageData + m*S_img->widthStep;
				unsigned char* T_ptr = (unsigned char*)T_gray1->imageData + m*T_gray1->widthStep;

				for( n=0; n<T_width; n++)
				{
					unsigned char S_value = S_ptr[n];
					unsigned char T_value = T_ptr[n];
					InterRelateValue      = InterRelateValue + S_value*T_value;      //S*T
					S_energy              = S_energy + S_value*S_value;				//  S
					T_energy              = T_energy + T_value*T_value;              //  T
				}
			}
			MatchValue = ((double)InterRelateValue) / ( sqrt((double)S_energy)*sqrt( (double)T_energy ) ); //  R(i,j)
			///////////////////////////////////////////////////////////
			if(MatchValue > MaxValue)   //    
			{
				MaxValue = MatchValue;
				Max_width = j;
				Max_height = i;
			}
			
			InterRelateValue = 0;
			S_energy = 0;
			T_energy = 0;
			
		}
	}
	cvSet2D( Match_image, Max_height, Max_width, cvScalar( 255, 0, 0, 0) );
	cvRectangle(img, cvPoint(Max_width, Max_height), cvPoint(Max_width+T_width, Max_height+T_height), cvScalar(0, 0, 255, 0), 1,8,0);
	
	cvShowImage("my picture",img);             //  ,               
	cvShowImage("my model",T_gray1);		   //   	
	cvShowImage("result",Match_image);         //     

	cvWaitKey(0);
	cvReleaseImage(&img);
	cvReleaseImage(&T_img);
	cvReleaseImage(&src_gray1);
	cvReleaseImage(&src_gray2);
	cvReleaseImage(&src_gray3);
	cvReleaseImage(&T_gray1);
	cvReleaseImage(&T_gray2);
	cvReleaseImage(&T_gray3);
	cvReleaseImage(&Match_image);
	cvReleaseImage(&S_img);
	
	
	cvDestroyWindow("my picture");
	cvDestroyWindow("my model");
	cvDestroyWindow("result");
	
 
	return 0;
}

좋은 웹페이지 즐겨찾기