20190710记录:去掉中转图,直接以1280*1024进行反坐标计算,填补pbFinal。
1、记录:去掉中转图,直接以1280*1024进行反坐标计算。pbFinal=1280*1024。
// Imagejoint.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Imagejoint.h"
#include "math.h"
#include <afxwin.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <atlimage.h>//CImage类
#include <locale.h> // The one and only application object CWinApp theApp; using namespace std;
//双三次插值系数
double fs(double w)
{
double a=-0.5;
double fs;
if (abs(w)<=)
fs=(a+)*pow(abs(w),)-(a+)*pow(abs(w),)+;
else if (abs(w)>&&abs(w)<=)
fs=a*pow(abs(w),)-*a*pow(abs(w),)+*a*abs(w)-*a;
else
fs=;
return fs;
} HRESULT Imagejoint(PBYTE pbSrc,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ int nRetCode = ;//表示整数类型的函数返回码。n表示整数类型,Ret是Return的缩写,表示返回值,Code表示代码。
setlocale(LC_ALL,"chs");
HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL)
{
// initialize MFC and print and error on failure
CImage cImage;
HRESULT hResult; //初始化一些变量
int iWidth,iHeight,iBytePerPixel,iPitch;
int x,y;
PBYTE pbSrc=NULL,pbFinal=NULL;//源图、目标图
PBYTE pbImage=NULL;//load图像后存在这
PDWORD pdwImage=NULL;//用于保存图像
double dbZoom=2.25; CString str = "frame1.bmp";
LPCTSTR filename = (LPCTSTR)str;
do{
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), ))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = ;
break;
}
//Load 图像到cImage对象中
hResult=cImage.Load(filename);
if(hResult!=ERROR_SUCCESS)
{
_tprintf(_T("源图像文件名错误!\n"));
nRetCode= -;
break;
} iWidth=cImage.GetWidth();
iHeight=cImage.GetHeight();
//分配源图内存
pbSrc = (PBYTE)malloc(iWidth*iHeight);
pbFinal = (PBYTE)malloc(*);
//while (dbZoom<3);
//{
//分配目标图内存 if(pbSrc==NULL || pbFinal==NULL )
{
_tprintf(_T("内存申请错误!\n"));
nRetCode= -;
break;
}
//cImage数据存到pbImage,后再转换为源灰度图pbSrc
iPitch=cImage.GetPitch();
iBytePerPixel=(cImage.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage.Destroy();
//TO DO:执行操作
hResult=Imagejoint(pbSrc,iWidth,iHeight,dbZoom,pbFinal);
if(hResult!=ERROR_SUCCESS)
{
_tprintf(_T("图像处理错误!\n"));
nRetCode= -;
break;
} //处理后保存图像
iWidth=;
iHeight=;
cImage.Create(iWidth,-iHeight,);
iPitch=cImage.GetPitch();
for(y=;y<iHeight;y++)
{
pdwImage=(PDWORD)(PBYTE(cImage.GetBits())+iPitch*y);
for(x=;x<iWidth;x++)
{
pdwImage[x]=pbFinal[y*iWidth+x]*0x10101;
}
}
//待保存图像文件名
CString name1="target";
CString name2;
name2.Format(_T("%.2lf"),dbZoom); CString csTagName;
csTagName=name1+name2;
//CString csTagName="target";
csTagName.Trim();
csTagName.MakeUpper();
if(csTagName.Right()!=_T(".BMP") ) csTagName.Append(_T(".BMP"));
hResult=cImage.Save(csTagName);
if(hResult!=ERROR_SUCCESS)
{
_tprintf(_T("图像结果保存错误!\n"));
nRetCode= -;
break;
}
_tprintf(_T("图像处理成功!\n"));
nRetCode= ERROR_SUCCESS;
break; //dbZoom=dbZoom+0.5;
//} }while();
if(pbSrc) free(pbSrc);
if(pbFinal) free(pbFinal); }
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = ;
}
getchar();
return nRetCode;
} HRESULT Imagejoint(PBYTE pbSrc,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal)
{
double phase[]={};//16相位,包含端点存在33个距离
for (int i=;i<;i++)
{
double i2=1.0*i;
phase[i]=fs(i2/);
} //旋转中心为图像中心
double rx0=iWidth;
double ry0=iHeight;
double srcx,srcy,u,v;
int xOr,yOr;
int newWidth=ceil(dbZoom*iWidth);
int newHeight=ceil(dbZoom*iHeight); for (int y=;y<;y++)
{
for (int x=;x<;x++)
{ srcx=(double)(newWidth/-+x)/dbZoom;
srcy=(double)(newHeight/-+y)/dbZoom ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; if( !(srcx>= && srcx<=iWidth && srcy>= && srcy<=iHeight))
{
pbFinal[y*+x]=;//
}
else
{
double middle=
pbSrc[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
}
}
}
return ERROR_SUCCESS;
}
2、外圈需拼接
目前dbZoom都是表示的,中间处的放大倍数。
由于目前测试图像是768*576的。
在dbZoom<1.75左右时,其外圈仍需补充拼接。
先进行简单测试:发现需补充拼接的点为,映射后落在原图外的部分。暂时仍采用同一图像进行外圈的拼接。
// Imagejoint.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Imagejoint.h"
#include <afxwin.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <atlimage.h>//CImage类
#include <locale.h>
#include "math.h"
using namespace std;
//双三次插值系数
double fs(double w)
{
double a=-0.5;
double fs;
if (abs(w)<=)
fs=(a+)*pow(abs(w),)-(a+)*pow(abs(w),)+;
else if (abs(w)>&&abs(w)<=)
fs=a*pow(abs(w),)-*a*pow(abs(w),)+*a*abs(w)-*a;
else
fs=;
return fs;
} HRESULT Imagejoint(PBYTE pbSrc,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ int nRetCode = ;//表示整数类型的函数返回码。n表示整数类型,Ret是Return的缩写,表示返回值,Code表示代码。
setlocale(LC_ALL,"chs");
HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL)
{
// initialize MFC and print and error on failure
CImage cImage;
HRESULT hResult; //初始化一些变量
int iWidth,iHeight,iBytePerPixel,iPitch;
int x,y;
PBYTE pbSrc=NULL,pbFinal=NULL;//源图、目标图
PBYTE pbImage=NULL;//load图像后存在这
PDWORD pdwImage=NULL;//用于保存图像
double dbZoom=1.25; CString str = "frame1.bmp";
LPCTSTR filename = (LPCTSTR)str;
do{
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), ))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = ;
break;
}
//Load 图像到cImage对象中
hResult=cImage.Load(filename);
if(hResult!=ERROR_SUCCESS)
{
_tprintf(_T("源图像文件名错误!\n"));
nRetCode= -;
break;
} iWidth=cImage.GetWidth();
iHeight=cImage.GetHeight();
//分配源图内存
pbSrc = (PBYTE)malloc(iWidth*iHeight);
pbFinal = (PBYTE)malloc(*);
//while (dbZoom<3);
//{
//分配目标图内存 if(pbSrc==NULL || pbFinal==NULL )
{
_tprintf(_T("内存申请错误!\n"));
nRetCode= -;
break;
}
//cImage数据存到pbImage,后再转换为源灰度图pbSrc
iPitch=cImage.GetPitch();
iBytePerPixel=(cImage.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage.Destroy();
//TO DO:执行操作
hResult=Imagejoint(pbSrc,iWidth,iHeight,dbZoom,pbFinal);
if(hResult!=ERROR_SUCCESS)
{
_tprintf(_T("图像处理错误!\n"));
nRetCode= -;
break;
} //处理后保存图像
iWidth=;
iHeight=;
cImage.Create(iWidth,-iHeight,);
iPitch=cImage.GetPitch();
for(y=;y<iHeight;y++)
{
pdwImage=(PDWORD)(PBYTE(cImage.GetBits())+iPitch*y);
for(x=;x<iWidth;x++)
{
pdwImage[x]=pbFinal[y*iWidth+x]*0x10101;
}
}
//待保存图像文件名
CString name1="target";
CString name2;
name2.Format(_T("%.2lf"),dbZoom); CString csTagName;
csTagName=name1+name2;
//CString csTagName="target";
csTagName.Trim();
csTagName.MakeUpper();
if(csTagName.Right()!=_T(".BMP") ) csTagName.Append(_T(".BMP"));
hResult=cImage.Save(csTagName);
if(hResult!=ERROR_SUCCESS)
{
_tprintf(_T("图像结果保存错误!\n"));
nRetCode= -;
break;
}
_tprintf(_T("图像处理成功!\n"));
nRetCode= ERROR_SUCCESS;
break; //dbZoom=dbZoom+0.5;
//} }while();
if(pbSrc) free(pbSrc);
if(pbFinal) free(pbFinal); }
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = ;
}
getchar();
return nRetCode;
} HRESULT Imagejoint(PBYTE pbSrc,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal)
{
double phase[]={};//16相位,包含端点存在33个距离
for (int i=;i<;i++)
{
double i2=1.0*i;
phase[i]=fs(i2/);
} //旋转中心为图像中心
double rx0=iWidth;
double ry0=iHeight;
double srcx,srcy,u,v;
int xOr,yOr;
int newWidth=ceil(dbZoom*iWidth);
int newHeight=ceil(dbZoom*iHeight); for (int y=;y<;y++)
{
for (int x=;x<;x++)
{ srcx=(double)(newWidth/-+x)/dbZoom;
srcy=(double)(newHeight/-+y)/dbZoom ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; if( !(srcx>= && srcx<=iWidth && srcy>= && srcy<=iHeight))//越界部分需拼接为外圈大视场图像,远景
{ srcx=(double)(newWidth/-+x)/(*dbZoom);
srcy=(double)(newHeight/-+y)/(*dbZoom) ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; double middle=
pbSrc[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
//pbFinal[y*1280+x]=255;
}
else
{
double middle=
pbSrc[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
}
}
}
return ERROR_SUCCESS;
}
3、初步改为利用双图拼接而来,但是其中一些参数不对,拼接位置不对。注意:代码起始阶段的图像长宽和内存分配,默认是两图相同的。
// Imagejoint.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Imagejoint.h"
#include <afxwin.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <atlimage.h>//CImage类
#include <locale.h>
#include "math.h"
using namespace std;
//双三次插值系数
double fs(double w)
{
double a=-0.5;
double fs;
if (abs(w)<=)
fs=(a+)*pow(abs(w),)-(a+)*pow(abs(w),)+;
else if (abs(w)>&&abs(w)<=)
fs=a*pow(abs(w),)-*a*pow(abs(w),)+*a*abs(w)-*a;
else
fs=;
return fs;
} HRESULT Imagejoint(PBYTE pbSrc1,PBYTE pbSrc2,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ int nRetCode = ;//表示整数类型的函数返回码。n表示整数类型,Ret是Return的缩写,表示返回值,Code表示代码。
setlocale(LC_ALL,"chs");
HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL)
{
// initialize MFC and print and error on failure
CImage cImage_far;
CImage cImage_near; HRESULT hResult1,hResult2; //初始化一些变量
int iWidth,iHeight,iBytePerPixel,iPitch;
int x,y;
PBYTE pbSrc1=NULL,pbSrc2=NULL,pbFinal=NULL;//源图、目标图
PBYTE pbImage=NULL;//load图像后存在这
PDWORD pdwImage=NULL;//用于保存图像
double dbZoom=1.25; CString str = "far-frame1.bmp";
CString str2 = "near-frame1.bmp";
LPCTSTR filename1 = (LPCTSTR)str;
LPCTSTR filename2 = (LPCTSTR)str2;
do{
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), ))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = ;
break;
}
//Load 图像到cImage对象中
hResult1=cImage_far.Load(filename1);
hResult2=cImage_near.Load(filename2);
if(hResult1!=ERROR_SUCCESS||hResult2!=ERROR_SUCCESS)
{
_tprintf(_T("源图像文件名错误!\n"));
nRetCode= -;
break;
} iWidth=cImage_far.GetWidth();
iHeight=cImage_far.GetHeight();
//分配源图内存
pbSrc1 = (PBYTE)malloc(iWidth*iHeight);
pbSrc2 = (PBYTE)malloc(iWidth*iHeight);
pbFinal = (PBYTE)malloc(*);
//while (dbZoom<3);
//{
//分配目标图内存 if(pbSrc1==NULL||pbSrc2==NULL || pbFinal==NULL )
{
_tprintf(_T("内存申请错误!\n"));
nRetCode= -;
break;
}
//cImage数据存到pbImage,后再转换为源灰度图pbSrc
iPitch=cImage_far.GetPitch();
iBytePerPixel=(cImage_far.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage_far.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc1[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage_far.Destroy(); iPitch=cImage_near.GetPitch();
iBytePerPixel=(cImage_near.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage_near.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc2[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage_near.Destroy();
//TO DO:执行操作
hResult1=Imagejoint(pbSrc1,pbSrc2,iWidth,iHeight,dbZoom,pbFinal);
if(hResult1!=ERROR_SUCCESS)
{
_tprintf(_T("图像处理错误!\n"));
nRetCode= -;
break;
} //处理后保存图像
iWidth=;
iHeight=;
cImage_far.Create(iWidth,-iHeight,);
iPitch=cImage_far.GetPitch();
for(y=;y<iHeight;y++)
{
pdwImage=(PDWORD)(PBYTE(cImage_far.GetBits())+iPitch*y);
for(x=;x<iWidth;x++)
{
pdwImage[x]=pbFinal[y*iWidth+x]*0x10101;
}
}
//待保存图像文件名
CString name1="target";
CString name2;
name2.Format(_T("%.2lf"),dbZoom); CString csTagName;
csTagName=name1+name2;
//CString csTagName="target";
csTagName.Trim();
csTagName.MakeUpper();
if(csTagName.Right()!=_T(".BMP") ) csTagName.Append(_T(".BMP"));
hResult1=cImage_far.Save(csTagName);
if(hResult1!=ERROR_SUCCESS)
{
_tprintf(_T("图像结果保存错误!\n"));
nRetCode= -;
break;
}
_tprintf(_T("图像处理成功!\n"));
nRetCode= ERROR_SUCCESS;
break; //dbZoom=dbZoom+0.5;
//} }while();
if(pbSrc1) free(pbSrc1);
if(pbSrc2) free(pbSrc2);
if(pbFinal) free(pbFinal); }
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = ;
}
getchar();
return nRetCode;
} HRESULT Imagejoint(PBYTE pbSrc1,PBYTE pbSrc2,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal)
{
double phase[]={};//16相位,包含端点存在33个距离
for (int i=;i<;i++)
{
double i2=1.0*i;
phase[i]=fs(i2/);
} //旋转中心为图像中心
double rx0=iWidth;
double ry0=iHeight;
double srcx,srcy,u,v;
int xOr,yOr;
int newWidth=ceil(dbZoom*iWidth);
int newHeight=ceil(dbZoom*iHeight); for (int y=;y<;y++)
{
for (int x=;x<;x++)
{ srcx=(double)(newWidth/-+x)/dbZoom;
srcy=(double)(newHeight/-+y)/dbZoom ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; if( !(srcx>= && srcx<=iWidth && srcy>= && srcy<=iHeight))//越界部分需拼接为外圈大视场图像,远景
{ srcx=(double)(newWidth/-+x)/(*dbZoom);
srcy=(double)(newHeight/-+y)/(*dbZoom) ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; double middle=
pbSrc1[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc1[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc1[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc1[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc1[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc1[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc1[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc1[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc1[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc1[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc1[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc1[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
//pbFinal[y*1280+x]=255;
}
else
{
double middle=
pbSrc2[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc2[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc2[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc2[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc2[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc2[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc2[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc2[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc2[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc2[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc2[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc2[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
}
}
}
return ERROR_SUCCESS;
}
4、对拼接位置修正,x+6,y-3。右6,上3。
// Imagejoint.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Imagejoint.h"
#include <afxwin.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <atlimage.h>//CImage类
#include <locale.h>
#include "math.h"
using namespace std;
//双三次插值系数
double fs(double w)
{
double a=-0.5;
double fs;
if (abs(w)<=)
fs=(a+)*pow(abs(w),)-(a+)*pow(abs(w),)+;
else if (abs(w)>&&abs(w)<=)
fs=a*pow(abs(w),)-*a*pow(abs(w),)+*a*abs(w)-*a;
else
fs=;
return fs;
} HRESULT Imagejoint(PBYTE pbSrc1,PBYTE pbSrc2,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ int nRetCode = ;//表示整数类型的函数返回码。n表示整数类型,Ret是Return的缩写,表示返回值,Code表示代码。
setlocale(LC_ALL,"chs");
HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL)
{
// initialize MFC and print and error on failure
CImage cImage_far;
CImage cImage_near; HRESULT hResult1,hResult2; //初始化一些变量
int iWidth,iHeight,iBytePerPixel,iPitch;
int x,y;
PBYTE pbSrc1=NULL,pbSrc2=NULL,pbFinal=NULL;//源图、目标图
PBYTE pbImage=NULL;//load图像后存在这
PDWORD pdwImage=NULL;//用于保存图像
double dbZoom=1.5; CString str = "far-frame1.bmp";
CString str2 = "near-frame1.bmp";
LPCTSTR filename1 = (LPCTSTR)str;
LPCTSTR filename2 = (LPCTSTR)str2;
do{
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), ))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = ;
break;
}
//Load 图像到cImage对象中
hResult1=cImage_far.Load(filename1);
hResult2=cImage_near.Load(filename2);
if(hResult1!=ERROR_SUCCESS||hResult2!=ERROR_SUCCESS)
{
_tprintf(_T("源图像文件名错误!\n"));
nRetCode= -;
break;
} iWidth=cImage_far.GetWidth();
iHeight=cImage_far.GetHeight();
//分配源图内存
pbSrc1 = (PBYTE)malloc(iWidth*iHeight);
pbSrc2 = (PBYTE)malloc(iWidth*iHeight);
pbFinal = (PBYTE)malloc(*);
//while (dbZoom<3);
//{
//分配目标图内存 if(pbSrc1==NULL||pbSrc2==NULL || pbFinal==NULL )
{
_tprintf(_T("内存申请错误!\n"));
nRetCode= -;
break;
}
//cImage数据存到pbImage,后再转换为源灰度图pbSrc
iPitch=cImage_far.GetPitch();
iBytePerPixel=(cImage_far.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage_far.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc1[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage_far.Destroy(); iPitch=cImage_near.GetPitch();
iBytePerPixel=(cImage_near.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage_near.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc2[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage_near.Destroy();
//TO DO:执行操作
hResult1=Imagejoint(pbSrc1,pbSrc2,iWidth,iHeight,dbZoom,pbFinal);
if(hResult1!=ERROR_SUCCESS)
{
_tprintf(_T("图像处理错误!\n"));
nRetCode= -;
break;
} //处理后保存图像
iWidth=;
iHeight=;
cImage_far.Create(iWidth,-iHeight,);
iPitch=cImage_far.GetPitch();
for(y=;y<iHeight;y++)
{
pdwImage=(PDWORD)(PBYTE(cImage_far.GetBits())+iPitch*y);
for(x=;x<iWidth;x++)
{
pdwImage[x]=pbFinal[y*iWidth+x]*0x10101;
}
}
//待保存图像文件名
CString name1="target";
CString name2;
name2.Format(_T("%.2lf"),dbZoom); CString csTagName;
csTagName=name1+name2;
//CString csTagName="target";
csTagName.Trim();
csTagName.MakeUpper();
if(csTagName.Right()!=_T(".BMP") ) csTagName.Append(_T(".BMP"));
hResult1=cImage_far.Save(csTagName);
if(hResult1!=ERROR_SUCCESS)
{
_tprintf(_T("图像结果保存错误!\n"));
nRetCode= -;
break;
}
_tprintf(_T("图像处理成功!\n"));
nRetCode= ERROR_SUCCESS;
break; //dbZoom=dbZoom+0.5;
//} }while();
if(pbSrc1) free(pbSrc1);
if(pbSrc2) free(pbSrc2);
if(pbFinal) free(pbFinal); }
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = ;
}
getchar();
return nRetCode;
} HRESULT Imagejoint(PBYTE pbSrc1,PBYTE pbSrc2,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal)
{
double phase[]={};//16相位,包含端点存在33个距离
for (int i=;i<;i++)
{
double i2=1.0*i;
phase[i]=fs(i2/);
} //旋转中心为图像中心
double rx0=iWidth;
double ry0=iHeight;
double srcx,srcy,u,v;
int xOr,yOr;
int newWidth=ceil(dbZoom*iWidth);
int newHeight=ceil(dbZoom*iHeight); for (int y=;y<;y++)
{
for (int x=;x<;x++)
{ srcx=(double)(newWidth/-+x)/dbZoom;
srcy=(double)(newHeight/-+y)/dbZoom ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; //Matlab中测试获取定值(34:541 -Y,41:728 -X),需要微调。
if( !(srcx>= && srcx<= && srcy>= && srcy<=))//越界部分需拼接为外圈大视场图像,远景
{ srcx=(double)(newWidth-+x)/(*dbZoom)+;//补偏差
srcy=(double)(newHeight-+y)/(*dbZoom)-;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; double middle=
pbSrc1[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc1[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc1[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc1[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc1[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc1[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc1[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc1[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc1[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc1[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc1[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc1[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
//pbFinal[y*1280+x]=255;
}
else
{
double middle=
pbSrc2[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc2[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc2[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc2[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc2[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc2[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc2[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc2[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc2[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc2[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc2[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc2[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
}
}
}
return ERROR_SUCCESS;
}
5、加入dbZoom自循环。
for(dbZoom=1.25;dbZoom<=2.25;dbZoom+=0.25)
但要注意!由于之后有:cImage_far.Destroy();和cImage_near.Destroy();
因此循环内应包含!CImage cImage_far;CImage cImage_near;
// Imagejoint.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Imagejoint.h"
#include <afxwin.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <atlimage.h>//CImage类
#include <locale.h>
#include "math.h"
using namespace std;
//双三次插值系数
double fs(double w)
{
double a=-0.5;
double fs;
if (abs(w)<=)
fs=(a+)*pow(abs(w),)-(a+)*pow(abs(w),)+;
else if (abs(w)>&&abs(w)<=)
fs=a*pow(abs(w),)-*a*pow(abs(w),)+*a*abs(w)-*a;
else
fs=;
return fs;
} HRESULT Imagejoint(PBYTE pbSrc1,PBYTE pbSrc2,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ int nRetCode = ;//表示整数类型的函数返回码。n表示整数类型,Ret是Return的缩写,表示返回值,Code表示代码。
setlocale(LC_ALL,"chs");
HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL)
{ HRESULT hResult1,hResult2;
//初始化一些变量
int iWidth,iHeight,iBytePerPixel,iPitch;
int x,y;
PBYTE pbSrc1=NULL,pbSrc2=NULL,pbFinal=NULL;//源图、目标图
PBYTE pbImage=NULL;//load图像后存在这
PDWORD pdwImage=NULL;//用于保存图像
double dbZoom=1.25; for(dbZoom=1.25;dbZoom<=2.25;dbZoom+=0.25)
{
CImage cImage_far;
CImage cImage_near; CString str = "far-frame1.bmp";
CString str2 = "near-frame1.bmp";
LPCTSTR filename1 = (LPCTSTR)str;
LPCTSTR filename2 = (LPCTSTR)str2; if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), ))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = ; }
//Load 图像到cImage对象中
hResult1=cImage_far.Load(filename1);
hResult2=cImage_near.Load(filename2);
if(hResult1!=ERROR_SUCCESS||hResult2!=ERROR_SUCCESS)
{
_tprintf(_T("源图像文件名错误!\n"));
nRetCode= -; } iWidth=cImage_far.GetWidth();
iHeight=cImage_far.GetHeight();
//分配源图内存
pbSrc1 = (PBYTE)malloc(iWidth*iHeight);
pbSrc2 = (PBYTE)malloc(iWidth*iHeight);
//分配目标图内存
pbFinal = (PBYTE)malloc(*);
if(pbSrc1==NULL||pbSrc2==NULL || pbFinal==NULL )
{
_tprintf(_T("内存申请错误!\n"));
nRetCode= -; }
//cImage数据存到pbImage,后再转换为源灰度图pbSrc
iPitch=cImage_far.GetPitch();
iBytePerPixel=(cImage_far.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage_far.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc1[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage_far.Destroy(); iPitch=cImage_near.GetPitch();
iBytePerPixel=(cImage_near.GetBPP()+)/;
if(iBytePerPixel==)
{
for(y=;y<iHeight;y++)
{ //load的图像数据放到pbImage
pbImage=(PBYTE)(PBYTE(cImage_near.GetBits())+iPitch*y);//得到的是图像初始像素地址
for(x=;x<iWidth;x++)
{
//pbImage转换为灰度图pbSrc
pbSrc2[y*iWidth+x]=(pbImage[*x]*0.15+pbImage[*x+]*0.55+pbImage[*x+]*0.3);
}
}
}
cImage_near.Destroy(); //执行操作
hResult1=Imagejoint(pbSrc1,pbSrc2,iWidth,iHeight,dbZoom,pbFinal);
if(hResult1!=ERROR_SUCCESS)
{
_tprintf(_T("图像处理错误!\n"));
nRetCode= -; }
//处理后保存图像
iWidth=;
iHeight=;
cImage_far.Create(iWidth,-iHeight,);
iPitch=cImage_far.GetPitch();
for(y=;y<iHeight;y++)
{
pdwImage=(PDWORD)(PBYTE(cImage_far.GetBits())+iPitch*y);
for(x=;x<iWidth;x++)
{
pdwImage[x]=pbFinal[y*iWidth+x]*0x10101;
}
}
//可预存待保存图像文件名
CString name1="target";
CString name2;
name2.Format(_T("%.2lf"),dbZoom);
CString csTagName;
csTagName=name1+name2; csTagName.Trim();
csTagName.MakeUpper();
if(csTagName.Right()!=_T(".BMP") ) csTagName.Append(_T(".BMP"));
hResult1=cImage_far.Save(csTagName);
if(hResult1!=ERROR_SUCCESS)
{
_tprintf(_T("图像结果保存错误!\n"));
nRetCode= -; }
_tprintf(_T("图像处理成功!\n"));
nRetCode= ERROR_SUCCESS; if(pbSrc1) free(pbSrc1);
if(pbSrc2) free(pbSrc2);
if(pbFinal) free(pbFinal);
}//对应+=0.25倍数的for循环。 }
else
{
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = ;
}
getchar();
return nRetCode;
} HRESULT Imagejoint(PBYTE pbSrc1,PBYTE pbSrc2,int iWidth,int iHeight,double dbZoom,PBYTE pbFinal)
{
double phase[]={};//16相位,包含端点存在33个距离
for (int i=;i<;i++)
{
double i2=1.0*i;
phase[i]=fs(i2/);
} //旋转中心为图像中心
double rx0=iWidth;
double ry0=iHeight;
double srcx,srcy,u,v;
int xOr,yOr;
int newWidth=ceil(dbZoom*iWidth);
int newHeight=ceil(dbZoom*iHeight); for (int y=;y<;y++)
{
for (int x=;x<;x++)
{ srcx=(double)(newWidth/-+x)/dbZoom;
srcy=(double)(newHeight/-+y)/dbZoom ;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; //Matlab中测试获取定值(34:541 -Y,41:728 -X),需要微调。
if( !(srcx>= && srcx<= && srcy>= && srcy<=))//越界部分需拼接为外圈大视场图像,远景
{ srcx=(double)(newWidth-+x)/(*dbZoom)+;//补偏差
srcy=(double)(newHeight-+y)/(*dbZoom)-;
xOr = floor(srcx);
yOr = floor(srcy);
u=srcx-xOr;
v=srcy-yOr; int phasex=floor(*u+0.5);//16相位
int phasey=floor(*v+0.5);
double A1,B1,C1,D1,A2,B2,C2,D2;
A1=phase[+phasex];
B1=phase[phasex];
C1=phase[-phasex];
D1=phase[-phasex]; A2=phase[+phasey];
B2=phase[phasey];
C2=phase[-phasey];
D2=phase[-phasey]; double middle=
pbSrc1[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc1[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc1[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc1[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc1[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc1[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc1[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc1[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc1[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc1[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc1[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc1[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc1[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
//pbFinal[y*1280+x]=255;
}
else
{
double middle=
pbSrc2[(yOr-)*iWidth+(xOr-)]*A1*A2+
pbSrc2[(yOr)*iWidth+(xOr-)]*A1*B2+
pbSrc2[(yOr+)*iWidth+(xOr-)]*A1*C2+
pbSrc2[(yOr+)*iWidth+(xOr-)]*A1*D2+ pbSrc2[(yOr-)*iWidth+(xOr)]*B1*A2+
pbSrc2[(yOr)*iWidth+(xOr)]*B1*B2+
pbSrc2[(yOr+)*iWidth+(xOr)]*B1*C2+
pbSrc2[(yOr+)*iWidth+(xOr)]*B1*D2+ pbSrc2[(yOr-)*iWidth+(xOr+)]*C1*A2+
pbSrc2[(yOr)*iWidth+(xOr+)]*C1*B2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*C1*C2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*C1*D2+ pbSrc2[(yOr-)*iWidth+(xOr+)]*D1*A2+
pbSrc2[(yOr)*iWidth+(xOr+)]*D1*B2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*D1*C2+
pbSrc2[(yOr+)*iWidth+(xOr+)]*D1*D2; if(middle<=&&middle>=)
pbFinal[y*+x]=middle;
else if(middle>)
pbFinal[y*+x]=;
else
pbFinal[y*+x]=;
}
}
}
return ERROR_SUCCESS;
}
至此,基本完成效果仿真。
但目前只是针对图像的。下面考虑如何读取.avi格式的视频文件处理。
20190710记录:去掉中转图,直接以1280*1024进行反坐标计算,填补pbFinal。的更多相关文章
- CozyRSS开发记录1-原型图与Grid
CozyRSS开发记录1-原型图与Grid 1.使用MockPlus画出最简陋的原型图 这个界面参考了目前我最常使用的RSS阅读-傲游浏览器的内置RSS阅读器.主体框架划分为上.左下.右下三块,分别是 ...
- 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类。Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分;School 中计算平均分的方法是所有科目的分数之和除以总科目数。 要求:定义ComputerAv
题目: 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数. 定义 Gymnastics 类和 School 类,它们都是 ComputerAverag ...
- PTA 7-12(图) 社交网络图中结点的“重要性”计算 最短路
7-12(图) 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的 ...
- Enterprise Architect13 : 去掉UML图页面右侧那一道竖线
我们在使用Enterprise Architect 中,画用例图,时序图时,页面右侧有一条竖线,见下图: 如果页面元素太多,会超出竖线的范围,显得很不协调. 如果像去掉竖线,只需选择主菜单的Layou ...
- 21种JavaScript设计模式最新记录(含图和示例)
最近观看了<Javascript设计模式系统讲解与应用>教程,对设计模式有了新的认识,特在此做些记录. 一.UML 文中会涉及众多的UML类图,在开篇需要做点基础概念的认识.以下面的图为例 ...
- Microsoft Build 2016 Day 2 记录(多图慎入)
Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩,因为主要和开发者相关
- uni-app学习记录04-轮播图和滑屏图片
<template> <view> <!-- 轮播图视图 swiper-item是每页的元素 --> <swiper :indicator-dots=&quo ...
- Unity学习疑问记录之将图切割保存
http://blog.csdn.net/poem_of_sunshine/article/details/43036553
- TortoiseSVN 同时检索多人的提交日志记录(如图操作)
随机推荐
- 如何对SAP Leonardo上的机器学习模型进行重新训练
Jerry之前的两篇文章介绍了如何通过Restful API的方式,消费SAP Leonardo上预先训练好的机器学习模型: 如何在Web应用里消费SAP Leonardo的机器学习API 部署在SA ...
- 理解JVM之内存分配以及分代思想实现
1.基本内存分批策略 大多数情况在新生代Eden区分配,如果启动了本地线程分配缓冲,将按线程优先在TLAB(线程私有缓冲区)上分配.当Eden区域没有足够的空间时将发起一次Minor GC. 值得注意 ...
- 重构drf项目后的manage.py报错的问题
Python3.6 用Django连接mysql一直报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer ...
- int类型按字节打印输出
今天在项目编程中,遇到一个问题,u32类型的参数,要赋值给一个u8 array[3],想用memcpy()函数进行赋值,由于类型大小不一致,一时不知道怎么做,经过查找,得以解决.说明如下; 项 ...
- ubuntu python3虚拟环境
mkvirtualenv flow_chart -p /usr/bin/python3.6 # 命令 环境名 -p python所在路径 pip install -r request ...
- sleep() 和 wait() 有什么区别?(未完成)
sleep() 和 wait() 有什么区别?(未完成)
- 视觉SLAM关键方法总结
点"计算机视觉life"关注,置顶更快接收消息! 最近在做基于激光信息的机器人行人跟踪发现如果单独利用激光信息很难完成机器人对行人的识别.跟踪等功能,因此考虑与视觉融合的方法,这样 ...
- webSocket的场景应用
应用场景 服务器更新 前端页面也进行局部刷新,更新服务器端返回的信息 什么是webSocket? 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对 ...
- c++初步认识
经过漫长的C学习终于踏入C++的知识库当中了,还是保持以前的习惯会一步步通过写博客的形式来记录点滴学习记录,这种学习方式是相当慢的,但是对我来说是最踏实的,不浮躁,一步一个脚印.C++是一门啥语言呢, ...
- SQL SERVER 2008 数据库隔离级别代码演示
SQL SERVER 2008 数据库隔离级别代码演示 个隔离级别(其实这是SQL 工业标) 种隔离级别,本身没有优劣之分,完全取决于应用的场景. 本质上,他们是在 隔离性(紊乱程度) 和 灵活性 ...