#include "stdio.h"
#include<cv.h>
#include<cvaux.h>
#include<highgui.h>
#include <iostream>
#include <tchar.h>
#pragma once
//RGB转成HSL
void RGBtoHSL(BYTE R,BYTE G,BYTE B,double *H,double *S,double *L)
{
double var_R,var_G,var_B;
double var_Min,var_Max,del_Max;
double h,s,l;
double del_R,del_G,del_B;
var_R=R/255.0; //RGB from 0 to 255
var_G=G/255.0;
var_B=B/255.0;
var_Min=min(var_R,min(var_G,var_B)); //Min. value of RGB
var_Max=max(var_R,max(var_G,var_B)); //Max. value of RGB
del_Max=var_Max-var_Min; //Delta RGB value
l=(var_Max+var_Min)/2.0;
if(del_Max==0) //This is a gray, no chroma...
{
h=0.0; //HSL results from 0 to 1
s=0.0;
}
else //Chromatic data...
{
if(l<0.5)
s=del_Max/(var_Max+var_Min);
else
s=del_Max/(2.0-var_Max-var_Min);
del_R=(((var_Max-var_R)/6.0)+(del_Max/2.0))/del_Max;
del_G=(((var_Max-var_G)/6.0)+(del_Max/2.0))/del_Max;
del_B=(((var_Max-var_B)/6.0)+(del_Max/2.0))/del_Max;
if(var_R==var_Max)
h=del_B-del_G;
else if(var_G==var_Max)
h=(1.0/3.0)+del_R-del_B;
else if(var_B==var_Max)
h=(2.0/3.0)+del_G-del_R;
if (h<0)
h+=1.0;
if (h>1)
h-=1.0;
}
//修改图像的色调、饱和度和亮度
*H=h;
if(*H>=1.0)
*H=1;
if(*H<=0)
*H=0;
*S=s;
if(*S>=1.0)
*S=1;
if(*S<=0)
*S=0;
*L=l*2;
if(*L>=1.0)
*L=1;
if(*L<=0)
*L=0;
}
//把HSL转换回RGB
double Hue_2_RGB(double v1,double v2,double vH) //Function Hue_2_RGB
{
if(vH<0)
vH+=1.0;
if(vH>1)
vH-=1.0;
if((6.0*vH)<1)
return(v1+(v2-v1)*6*vH);
if((2.0*vH)<1)
return(v2);
if((3.0*vH)<2)
return(v1+(v2-v1)*((2.0/3.0)-vH)*6.0);
return(v1);
}
void HSLtoRGB(double H,double S,double L,BYTE *R,BYTE *G,BYTE *B)
{
BYTE r,g,b;
double var_1,var_2;
if(S==0) //HSL from 0 to 1
{
r=(BYTE)(L*255.0); //RGB results from 0 to 255
g=(BYTE)(L*255.0);
b=(BYTE)(L*255.0);
}
else
{
if(L<0.5)
var_2=L*(1.0+S);
else
var_2=(L+S)-(S*L);
var_1=2.0*L-var_2;
r=(BYTE)(255*Hue_2_RGB(var_1,var_2,H+(1.0/3.0)));
g=(BYTE)(255*Hue_2_RGB(var_1,var_2,H));
b=(BYTE)(255*Hue_2_RGB(var_1,var_2,H-(1.0/3.0)));
}
*R=r;
*G=g;
*B=b;
}
int _tmain()
{
//IMG为理想的拼接图
int i,j,k;
CvSize size=cvSize(1280,1024);
IplImage* IMG=new IplImage;
IMG=cvCreateImage(size,8,3);
BYTE* RGB=new BYTE[1280*1024*3];
for (i=0;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
if (j>=128&&j<=1152&&i>=128&&i<=896)
RGB[i*1280*3+j*3+k]=0;
else
RGB[i*1280*3+j*3+k]=255;
}
IplImage* img1;
img1=cvLoadImage("tu1.bmp",-1);
BYTE* rgb1=new BYTE[768*768*3];
memcpy(rgb1,img1->imageData,768*768*3);
IplImage* img2;
img2=cvLoadImage("tu2.bmp",-1);
BYTE* rgb2=new BYTE[768*768*3];
memcpy(rgb2,img2->imageData,768*768*3);
//图像左边部分
for(i=0;i<768;i++)
for(j=0;j<256;j++)
for(k=0;k<3;k++)
{
RGB[(i+128)*1280*3+(j+128)*3+k]=rgb1[i*768*3+j*3+k];
}
//图像右边部分
for(i=0;i<768;i++)
for(j=512;j<768;j++)
for(k=0;k<3;k++)
{
RGB[(i+128)*1280*3+(j+384)*3+k]=rgb2[i*768*3+j*3+k];
}
//图像重叠部分
for(i=0;i<768;i++)
for(j=256;j<768;j++)
for(k=0;k<3;k++)
{
RGB[(i+128)*1280*3+(j+128)*3+k]=rgb1[i*768*3+j*3+k];
}
cvSetData(IMG,RGB,3840);
//img11为实际显示左图
IplImage* img11=new IplImage;
img11=cvCloneImage(IMG);
BYTE* rgb11=new BYTE[1280*1024*3];
CvPoint2D32f src_point1[4];
CvPoint2D32f dst_point1[4];
//设定源观察面,即指定四边形的四个顶点
src_point1[0].x=128;
src_point1[0].y=128;
src_point1[1].x=896;
src_point1[1].y=128;
src_point1[2].x=128;
src_point1[2].y=896;
src_point1[3].x=896;
src_point1[3].y=896;
//设定目标观察面,即指定四边形的四个顶点
dst_point1[0].x=128;
dst_point1[0].y=256;
dst_point1[1].x=896;
dst_point1[1].y=128;
dst_point1[2].x=128;
dst_point1[2].y=896;
dst_point1[3].x=768;
dst_point1[3].y=896;
float newm1[9];
CvMat newM1=cvMat(3,3,CV_32F,newm1);
//获得透视转换矩阵
cvWarpPerspectiveQMatrix(src_point1,dst_point1,&newM1);
//透视转换
cvWarpPerspective(IMG,img11,&newM1,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
memcpy(rgb11,img11->imageData,1280*1024*3);
for (i=0;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
if(i<=832.0/3.0-1.0/6.0*j||i>=5504-6*j||i<=128||j>=896)
rgb11[i*1280*3+j*3+k]=255;
}
for(i=0;i<1024;i++)
for(j=0;j<128;j++)
for (k=0;k<3;k++)
{
rgb11[i*1280*3+j*3+k]=255;
}
for(i=896;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
rgb11[i*1280*3+j*3+k]=255;
}
cvSetData(img11,rgb11,3840);
//img22为实际显示右图
IplImage* img22=new IplImage;
img22=cvCloneImage(IMG);
BYTE* rgb22=new BYTE[1280*1024*3];
CvPoint2D32f src_point2[4];
CvPoint2D32f dst_point2[4];
//设定源观察面,即指定四边形的四个顶点
src_point2[0].x=384;
src_point2[0].y=128;
src_point2[1].x=1152;
src_point2[1].y=128;
src_point2[2].x=384;
src_point2[2].y=896;
src_point2[3].x=1152;
src_point2[3].y=896;
//设定目标观察面,即指定四边形的四个顶点
dst_point2[0].x=384;
dst_point2[0].y=128;
dst_point2[1].x=1152;
dst_point2[1].y=256;
dst_point2[2].x=512;
dst_point2[2].y=896;
dst_point2[3].x=1152;
dst_point2[3].y=896;
float newm2[9];
CvMat newM2=cvMat(3,3,CV_32F,newm2);
//获得透视转换矩阵
cvWarpPerspectiveQMatrix(src_point2,dst_point2,&newM2);
//透视转换
cvWarpPerspective(IMG,img22,&newM2,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
memcpy(rgb22,img22->imageData,1280*1024*3);
for (i=0;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
if(i<=1.0/6.0*j+64||i>=6*j-2176||i>=896||j>=1152)
rgb22[i*1280*3+j*3+k]=255;
}
cvSetData(img22,rgb22,3840);
//img为实际未校正拼接图
IplImage* img=new IplImage;
img=cvCloneImage(IMG);
BYTE* rgb=new BYTE[1280*1024*3];
//图像左边部分和右上角部分
for (i=0;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
if ((j>=128&&i<=896&&i>=832.0/3.0-1.0/6.0*j&&i>=6.0*j-2176)||
(i>=832.0/3.0-1.0/6.0*j&&i<=64+1.0/6.0*j&&i<=5504-6*j))
rgb[i*1280*3+j*3+k]=rgb11[i*1280*3+j*3+k];
}
//图像右边部分和左上角部分
for (i=0;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
if ((j<=1152&&i<=896&&i>=64+1.0/6.0*j&&i>=5504-6*j)||
(i>=64+1.0/6.0*j&&i<=6*j-2176&&i<=832.0/3.0-1.0/6.0*j))
rgb[i*1280*3+j*3+k]=rgb22[i*1280*3+j*3+k];
}
//图像中间重叠部分
for (i=0;i<1024;i++)
for(j=0;j<1280;j++)
for (k=0;k<3;k++)
{
if(i>=832.0/3.0-1.0/6.0*j&&i>=64+1.0/6.0*j&&i<=6.0*j-2176&&i<=5504-6*j&&i<=896)
rgb[i*1280*3+j*3+k]=rgb11[i*1280*3+j*3+k]+rgb22[i*1280*3+j*3+k];
}
cvSetData(img,rgb,3840);
//Img_he为调整形状未调节亮度的图像
IplImage* Img_he=new IplImage;
Img_he=cvCloneImage(IMG);
BYTE* rgb_he=new BYTE[1280*1024*3];
CvPoint2D32f src_point3[4];
CvPoint2D32f dst_point3[4];
//设定源观察面,即指定四边形的四个顶点
src_point3[0].x=128;
src_point3[0].y=128;
src_point3[1].x=1152;
src_point3[1].y=128;
src_point3[2].x=128;
src_point3[2].y=896;
src_point3[3].x=1152;
src_point3[3].y=896;
//设定目标观察面,即指定四边形的四个顶点
dst_point3[0].x=128;
dst_point3[0].y=256;
dst_point3[1].x=1152;
dst_point3[1].y=256;
dst_point3[2].x=128;
dst_point3[2].y=896;
dst_point3[3].x=1152;
dst_point3[3].y=896;
float newm3[
- 1
- 2
- 3
前往页