www.pudn.com > UltraSound.rar > UltraSoundView.cpp
// UltraSoundView.cpp : implementation of the CUltraSoundView class
//
#include "stdafx.h"
#include "UltraSound.h"
#include "mainfrm.h"
#include "UltraSoundDoc.h"
#include "UltraSoundView.h"
#include "math.h"
#include "ippm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CString g_name;
/////////////////////////////////////////////////////////////////////////////
// CUltraSoundView
IMPLEMENT_DYNCREATE(CUltraSoundView, CScrollView)
BEGIN_MESSAGE_MAP(CUltraSoundView, CScrollView)
//{{AFX_MSG_MAP(CUltraSoundView)
ON_COMMAND(ID_START, OnStart)
ON_UPDATE_COMMAND_UI(ID_START, OnUpdateStart)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
ON_WM_CONTEXTMENU()
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUltraSoundView construction/destruction
CUltraSoundView::CUltraSoundView()
{
// TODO: add construction code here
}
CUltraSoundView::~CUltraSoundView()
{
}
BOOL CUltraSoundView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CUltraSoundView drawing
void CUltraSoundView::OnDraw(CDC* pDC)
{
CUltraSoundDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rect;
GetClientRect(rect);
pDC->FillSolidRect (rect, RGB(255,255,255));
int xpos, ypos;
if (m_EndImg != NULL)
{
xpos = (rect.Width () - m_EndImg->width) / 2;
ypos = (rect.Height () - m_EndImg->height) / 2;
ShowImageGray(m_EndImg, xpos, ypos);
}
}
void CUltraSoundView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
m_Dx = 0;
m_Dy = 0;
m_GlobalDx = 0;
m_GlobalDy = 0;
m_ImageWidth = 0;
m_ImageHeight = 0;
m_GlobalHeight = 0;
m_GlobalWidth =0;
m_GlobalOffsetX = 0;
m_GlobalOffsetY = 0;
m_dx = NULL;
m_dy = NULL;
m_totaldx = 0;
m_totaldy = 0;
m_MotionDir = TRUE;
m_BlockHeight = 32;
m_BlockWidth = 32;
m_EndImg = NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CUltraSoundView printing
void CUltraSoundView::OnFilePrintPreview()
{
BCGPPrintPreview (this);
}
BOOL CUltraSoundView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CUltraSoundView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CUltraSoundView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CUltraSoundView diagnostics
#ifdef _DEBUG
void CUltraSoundView::AssertValid() const
{
CScrollView::AssertValid();
}
void CUltraSoundView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CUltraSoundDoc* CUltraSoundView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CUltraSoundDoc)));
return (CUltraSoundDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CUltraSoundView message handlers
void CUltraSoundView::OnContextMenu(CWnd*, CPoint point)
{
theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
}
// 此函数将一帧图像数据复制到float型的矩阵中。
float* CUltraSoundView::Matrix(IplImage* img, float* Matrix)
{
float* Image32 = Matrix;
unsigned char* ptr = (unsigned char*)img->imageData;
for(int i=0;iimageSize;i++)
{
*Image32 = *ptr;
Image32++;
ptr++;
}
return Matrix;
}
void CUltraSoundView::OnStart()
{
// TODO: Add your command handler code here
CUltraSoundDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i;
int ImageNum = pDoc->m_ImgNum;
IplImage* Image = pDoc->m_pImageList[0];
m_ImageWidth = Image->width;
m_ImageHeight = Image->height;
m_GlobalWidth = m_ImageWidth;
m_GlobalHeight = m_ImageHeight;
m_dx = (int*)malloc((ImageNum-1)*sizeof(int));
m_dy = (int*)malloc((ImageNum-1)*sizeof(int));
m_sub = (float*)malloc(m_BlockWidth*m_BlockHeight*sizeof(float));
m_OldImageMat = (float*)malloc(Image->imageSize*sizeof(float)*5);
m_DstImageMat = (float*)malloc(Image->imageSize*sizeof(float)*5);
m_ShowImageMat = (float*)malloc(Image->imageSize*sizeof(float)*5);
m_AddImageMat = (float*)malloc(Image->imageSize*sizeof(float));
m_CurImageMat = (float*)malloc(Image->imageSize*sizeof(float));
m_HalfCurImageMat = (float*)malloc(Image->imageSize*sizeof(float));
m_HalfOldImageMat = (float*)malloc(Image->imageSize*sizeof(float));
IppStatus
Status = ippmMul_mc_32f(m_DstImageMat,Image->imageSize*sizeof(float),0,
m_DstImageMat,Image->imageSize*sizeof(float),Image->imageSize,5);
Status = ippmMul_mc_32f(m_OldImageMat,Image->imageSize*sizeof(float),0,
m_OldImageMat,Image->imageSize*sizeof(float),Image->imageSize,5);
Status = ippmMul_mc_32f(m_ShowImageMat,Image->imageSize*sizeof(float),0,
m_ShowImageMat,Image->imageSize*sizeof(float),Image->imageSize,5);
Status = ippmMul_mc_32f(m_AddImageMat,Image->imageSize*sizeof(float),0,
m_AddImageMat,Image->imageSize*sizeof(float),Image->imageSize,1);
Status = ippmMul_mc_32f(m_CurImageMat,Image->imageSize*sizeof(float),0,
m_CurImageMat,Image->imageSize*sizeof(float),Image->imageSize,1);
Status = ippmMul_mc_32f(m_HalfCurImageMat,Image->imageSize*sizeof(float),0,
m_HalfCurImageMat,Image->imageSize*sizeof(float),Image->imageSize,1);
Status = ippmMul_mc_32f(m_HalfOldImageMat,Image->imageSize*sizeof(float),0,
m_HalfOldImageMat,Image->imageSize*sizeof(float),Image->imageSize,1);
m_OldImageMat = Matrix(Image,m_OldImageMat);
m_HalfOldImageMat = Matrix(Image,m_HalfOldImageMat);
((CMainFrame*)theApp.m_pMainWnd)->m_wndStatusBar.EnablePaneProgressBar(1, ImageNum, true);
//运动检测,确定相邻两帧之间的位置偏移。
for(i=1;im_wndStatusBar.SetPaneProgress(1, i+1);
}
((CMainFrame*)theApp.m_pMainWnd)->m_wndStatusBar.EnablePaneProgressBar(1, -1);
/* //确定移动方向。
for(int j=0;j=abs(m_totaldy))
m_MotionDir = TRUE;
else
m_MotionDir = FALSE;
*/
//图像拼接。
for(i=1;iimageSize,0,DstMat,
// Image->imageSize,Image->imageSize,5);
Image = pDoc->m_pImageList[i];
m_CurImageMat = Matrix(Image,m_CurImageMat);
Mosacing(i);
}
free(m_sub);
free(m_OldImageMat);
free(m_DstImageMat);
free(m_ShowImageMat);
free(m_AddImageMat);
free(m_CurImageMat);
free(m_HalfCurImageMat);
free(m_HalfOldImageMat);
free(m_dx);
free(m_dy);
}
CPoint CUltraSoundView::LeastSquare(int i)
{
CUltraSoundDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// IplImage* BaseImage = pDoc->m_pImageList[i-1];
IplImage* CurImage = pDoc->m_pImageList[i];
// IplImage* Image = pDoc->m_pImageList[0];
int SearchLeft = -10;
int SearchRight = 10;
int SeatchTop = -3;
int SearchBottom = 3;
// int m_BlockHeight = 32;
// int m_BlockWidth = 32;
// float* m_HalfOldImageMat = (float*)malloc(Image->imageSize*sizeof(float));
// float* m_CurImageMat = (float*)malloc(Image->imageSize*sizeof(float));
// m_HalfOldImageMat = Matrix(BaseImage,m_HalfOldImageMat);
m_CurImageMat = Matrix(CurImage,m_CurImageMat);
// float* pDst = (float*)malloc(BlockHeight*BlockWidth*sizeof(float));
float MSAD = 0;
float OffsetX = 0;
float OffsetY = 0;
int Dx = 0;
int Dy = 0;
int xNumofSubImage = m_ImageWidth/m_BlockWidth;
int yNumofSubImage = m_ImageHeight/m_BlockHeight;
//每帧图像行与行之间的内存偏移量。
Ipp32s srce1Stride1 = CurImage->widthStep*sizeof(float);
Ipp32s srce2Stride1 = CurImage->widthStep*sizeof(float);//因为每帧大小相同。
Ipp32s dst1Stride1 = m_BlockWidth*sizeof(float);
// float aa[1000];
//least square;
// for(int j=0;j< yNumofSubImage;j++)
// for(int k=0;km_ImageWidth - m_BlockWidth - 1 ) x1 = m_ImageWidth - m_BlockWidth - 1;
if(y1>m_ImageHeight - m_BlockHeight - 1 ) y1 = m_ImageHeight - m_BlockHeight - 1;
float SAD = 0;
// for(int y=y0;y<=y1;y++)
// for(int x=x0;x<=x1;x++)
for(int x=x0;x<=x1;x++)
for(int y=y0;y<=y1;y++)
{
SAD = 0;
Ipp32f* pSrc1 = m_HalfOldImageMat + x + y*CurImage->widthStep;
Ipp32f* pSrc2 = m_CurImageMat + InitX + InitY*CurImage->widthStep;
IppStatus status = ippmSub_mm_32f (pSrc1,srce1Stride1,
pSrc2,srce2Stride1,
m_sub, dst1Stride1,
32, 32);
status = ippmFrobNorm_m_32f(m_sub,32*sizeof(float),32,32,&SAD);
/*----------------------------------------------------------------------------------------------
// int a[32][32];
float* p =pDst;
for(int suby=0;suby<32;suby++)
for(int subx=0;subx<32;subx++)
{
// a[suby][subx] = (int)*p;
SAD = SAD+(float)fabs(*p);
p++;
}
aa[ss]=SAD;
ss++;
//-----------------------------------------------------------------------------------------------
*/
if(MSAD>SAD||MSAD==0)
{
MSAD = SAD;
dx = x-InitX;
dy = y-InitY;
}
}
OffsetX = OffsetX + dx;
OffsetY = OffsetY + dy;
SAD=0;
MSAD = 0;
}
OffsetX = (float)OffsetX/(xNumofSubImage*yNumofSubImage);
OffsetY = (float)OffsetY/(xNumofSubImage*yNumofSubImage);
if(m_GlobalOffsetX>=0)
Dx = (int)(m_GlobalOffsetX + OffsetX +0.5) - (int)(m_GlobalOffsetX + 0.5);
else
Dx = (int)(m_GlobalOffsetX + OffsetX -0.5) - (int)(m_GlobalOffsetX - 0.5);
if(m_GlobalOffsetY>=0)
Dy = (int)(m_GlobalOffsetY + OffsetY +0.5) - (int)(m_GlobalOffsetY + 0.5);
else
Dy = (int)(m_GlobalOffsetY + OffsetY -0.5) - (int)(m_GlobalOffsetY - 0.5);
m_GlobalOffsetX= m_GlobalOffsetX + OffsetX;
m_GlobalOffsetY= m_GlobalOffsetY + OffsetY;
float* p = m_HalfOldImageMat;
m_HalfOldImageMat = m_CurImageMat;
m_CurImageMat = p;
CPoint pt;
pt.x = Dx;
pt.y = Dy;
return pt;
}
void CUltraSoundView::Mosacing(int i)
{
m_Dx = m_dx[i-1];
m_Dy = m_dy[i-1];
if(abs(m_GlobalDx)>abs(m_GlobalDy))
{
if(m_GlobalDx<0)
{
if(m_Dx>=0) return;
if(m_Dx<0 && m_Dy*m_GlobalDy<0) return;
}
if(m_GlobalDx>0)
{
if(m_Dx<=0) return;
if(m_Dx>0 && m_Dy*m_GlobalDy<0) return;
}
}
if(abs(m_GlobalDy)>abs(m_GlobalDx))
{
if(m_GlobalDy<0)
{
if(m_Dy>=0) return;
if(m_Dy<0 && m_Dx*m_GlobalDx<0) return;
}
if(m_GlobalDy>0)
{
if(m_Dy<=0) return;
if(m_Dy>0 && m_Dx*m_GlobalDx<0) return;
}
}
//向坐上角运动.
if(m_Dx < 0 && m_Dy<=0)
{
int srcROIShift = 0;
int srcStride1 = m_GlobalWidth*sizeof(float);
int srcStride2 = 1*sizeof(float);
int dstROIShift =-m_Dx*sizeof(float)-m_Dy*(m_GlobalWidth-m_Dx)*sizeof(float);
int dstStride1 = (m_GlobalWidth-m_Dx)*sizeof(float);
int dstStride2 = 1*sizeof(float);
IppStatus Status;
//step 1;将前一帧图像复制到右下角。
Status = ippmCopy_ma_32f_LL((const float**)&m_OldImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_GlobalWidth,m_GlobalHeight,1);
srcROIShift = 0;
srcStride1 = (m_GlobalWidth-m_Dx)*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step2;前一帧重叠部分除二
Status =ippmMul_mac_32f_L((const float**)&m_DstImageMat,srcROIShift,srcStride1,0.5,
&m_HalfOldImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step3;复制当前帧;
Status = ippmCopy_ma_32f_LL((const float**)&m_CurImageMat,srcROIShift,srcStride1,srcStride2,
&m_HalfCurImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = -m_Dx*sizeof(float)-m_Dy*m_ImageWidth*sizeof(float);
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = -m_Dx*sizeof(float)-m_Dy*m_ImageWidth*sizeof(float);
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step4;当前帧重叠部分除二。
Status =ippmMul_mac_32f_L((const float**)&m_CurImageMat,srcROIShift,srcStride1,0.5,
&m_HalfCurImageMat,dstROIShift,dstStride1,
m_ImageWidth+m_Dx,m_ImageHeight+m_Dy,1);
int src1ROIShift = 0;
int src1Stride1 = m_ImageWidth*sizeof(float);
int src2ROIShift = 0;
int src2Stride1 = m_ImageWidth*sizeof(float);
dstROIShift =0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step5:重叠部分图像相加。
ippmAdd_mama_32f_L((const float**)&m_HalfOldImageMat,src1ROIShift,src1Stride1,
(const float**)&m_HalfCurImageMat,src2ROIShift,src2Stride1,
&m_AddImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift =0;
dstStride1 = (m_GlobalWidth-m_Dx)*sizeof(float);
dstStride2 = 1*sizeof(float);
//step6:重叠部分复制回去。
Status = ippmCopy_ma_32f_LL((const float**)&m_AddImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
float* mat = m_OldImageMat;
m_OldImageMat = m_DstImageMat;
m_DstImageMat = mat;
//更新拼接图的宽度和高度。
if(m_Dx<=0)
{
m_GlobalWidth = m_GlobalWidth - m_Dx;
}
else
{
m_GlobalWidth = m_GlobalWidth + m_Dx;
}
if(m_Dy<=0)
{
m_GlobalHeight = m_GlobalHeight - m_Dy;
}
else
{
m_GlobalHeight = m_GlobalHeight + m_Dy;
}
// ShowImage();
}
//////////////////////////////////////////////////////////////////////////////////
//向左下角运动
if(m_Dx <= 0 && m_Dy > 0)
{
int srcROIShift = 0;
int srcStride1 = m_GlobalWidth*sizeof(float);
int srcStride2 = 1*sizeof(float);
int dstROIShift =-m_Dx*sizeof(float);
int dstStride1 = (m_GlobalWidth-m_Dx)*sizeof(float);
int dstStride2 = 1*sizeof(float);
IppStatus Status;
//step 1;将前一帧图像复制到右上角。
Status = ippmCopy_ma_32f_LL((const float**)&m_OldImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_GlobalWidth,m_GlobalHeight,1);
srcROIShift = (m_GlobalHeight - m_ImageHeight+m_Dy)*(m_GlobalWidth-m_Dx)*sizeof(float);
srcStride1 = (m_GlobalWidth-m_Dx)*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step2;前一帧重叠部分除二
Status =ippmMul_mac_32f_L((const float**)&m_DstImageMat,srcROIShift,srcStride1,0.5,
&m_HalfOldImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step3;复制当前帧;
Status = ippmCopy_ma_32f_LL((const float**)&m_CurImageMat,srcROIShift,srcStride1,srcStride2,
&m_HalfCurImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = -m_Dx*sizeof(float);
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = -m_Dx*sizeof(float);
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step4;当前帧重叠部分除二。
Status =ippmMul_mac_32f_L((const float**)&m_CurImageMat,srcROIShift,srcStride1,0.5,
&m_HalfCurImageMat,dstROIShift,dstStride1,
m_ImageWidth+m_Dx,m_ImageHeight-m_Dy,1);
int src1ROIShift = 0;
int src1Stride1 = m_ImageWidth*sizeof(float);
int src2ROIShift = 0;
int src2Stride1 = m_ImageWidth*sizeof(float);
dstROIShift =0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step5:重叠部分图像相加。
ippmAdd_mama_32f_L((const float**)&m_HalfOldImageMat,src1ROIShift,src1Stride1,
(const float**)&m_HalfCurImageMat,src2ROIShift,src2Stride1,
&m_AddImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = (m_GlobalHeight - m_ImageHeight+m_Dy)*(m_GlobalWidth-m_Dx)*sizeof(float);
dstStride1 = (m_GlobalWidth-m_Dx)*sizeof(float);
dstStride2 = 1*sizeof(float);
//step6:重叠部分复制回去。
Status = ippmCopy_ma_32f_LL((const float**)&m_AddImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
float* mat = m_OldImageMat;
m_OldImageMat = m_DstImageMat;
m_DstImageMat = mat;
//更新拼接图的宽度和高度。
if(m_Dx<=0)
{
m_GlobalWidth = m_GlobalWidth - m_Dx;
}
else
{
m_GlobalWidth = m_GlobalWidth + m_Dx;
}
if(m_Dy<=0)
{
m_GlobalHeight = m_GlobalHeight - m_Dy;
}
else
{
m_GlobalHeight = m_GlobalHeight + m_Dy;
}
// ShowImage();
}
//以上代码实现向左下角运动拼接
//////////////////////////////////////////////////////////////////////////////////
//向右下角运动
if(m_Dx > 0 && m_Dy >= 0)
{
int srcROIShift = 0;
int srcStride1 = m_GlobalWidth*sizeof(float);
int srcStride2 = 1*sizeof(float);
int dstROIShift =0;
int dstStride1 = (m_GlobalWidth+m_Dx)*sizeof(float);
int dstStride2 = 1*sizeof(float);
IppStatus Status;
//step 1;将前一帧图像复制到左上角。
Status = ippmCopy_ma_32f_LL((const float**)&m_OldImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_GlobalWidth,m_GlobalHeight,1);
srcROIShift = m_Dx*sizeof(float)+(m_GlobalHeight - m_ImageHeight+m_Dy)*(m_GlobalWidth+m_Dx)*sizeof(float);
srcStride1 = (m_GlobalWidth+m_Dx)*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = m_Dx*sizeof(float)+(m_GlobalHeight - m_ImageHeight+m_Dy)*(m_GlobalWidth+m_Dx)*sizeof(float);
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step2;前一帧重叠部分除二
Status =ippmMul_mac_32f_L((const float**)&m_DstImageMat,srcROIShift,srcStride1,0.5,
&m_HalfOldImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step3;复制当前帧;
Status = ippmCopy_ma_32f_LL((const float**)&m_CurImageMat,srcROIShift,srcStride1,srcStride2,
&m_HalfCurImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step4;当前帧重叠部分除二。
Status =ippmMul_mac_32f_L((const float**)&m_CurImageMat,srcROIShift,srcStride1,0.5,
&m_HalfCurImageMat,dstROIShift,dstStride1,
m_ImageWidth-m_Dx,m_ImageHeight-m_Dy,1);
int src1ROIShift = 0;
int src1Stride1 = m_ImageWidth*sizeof(float);
int src2ROIShift = 0;
int src2Stride1 = m_ImageWidth*sizeof(float);
dstROIShift =0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step5:重叠部分图像相加。
ippmAdd_mama_32f_L((const float**)&m_HalfOldImageMat,src1ROIShift,src1Stride1,
(const float**)&m_HalfCurImageMat,src2ROIShift,src2Stride1,
&m_AddImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = m_Dx*sizeof(float)+(m_GlobalHeight - m_ImageHeight+m_Dy)*(m_GlobalWidth+m_Dx)*sizeof(float);
dstStride1 = (m_GlobalWidth+m_Dx)*sizeof(float);
dstStride2 = 1*sizeof(float);
//step6:重叠部分复制回去。
Status = ippmCopy_ma_32f_LL((const float**)&m_AddImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
float* mat = m_OldImageMat;
m_OldImageMat = m_DstImageMat;
m_DstImageMat = mat;
//更新拼接图的宽度和高度。
if(m_Dx<=0)
{
m_GlobalWidth = m_GlobalWidth - m_Dx;
}
else
{
m_GlobalWidth = m_GlobalWidth + m_Dx;
}
if(m_Dy<=0)
{
m_GlobalHeight = m_GlobalHeight - m_Dy;
}
else
{
m_GlobalHeight = m_GlobalHeight + m_Dy;
}
// ShowImage();
}
//以上代码实现向右下角拼接
/////////////////////////////////////////////////////////////////////////
//向右上角运动
if(m_Dx > 0 && m_Dy < 0)
{
int srcROIShift = 0;
int srcStride1 = m_GlobalWidth*sizeof(float);
int srcStride2 = 1*sizeof(float);
int dstROIShift = -m_Dy*(m_GlobalWidth+m_Dx)*sizeof(float);
int dstStride1 = (m_GlobalWidth+m_Dx)*sizeof(float);
int dstStride2 = 1*sizeof(float);
IppStatus Status;
//step 1;将前一帧图像复制到左下角。
Status = ippmCopy_ma_32f_LL((const float**)&m_OldImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_GlobalWidth,m_GlobalHeight,1);
srcROIShift = m_Dx*sizeof(float);
srcStride1 = (m_GlobalWidth+m_Dx)*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step2;前一帧重叠部分除二
Status =ippmMul_mac_32f_L((const float**)&m_DstImageMat,srcROIShift,srcStride1,0.5,
&m_HalfOldImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = 0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step3;复制当前帧;
Status = ippmCopy_ma_32f_LL((const float**)&m_CurImageMat,srcROIShift,srcStride1,srcStride2,
&m_HalfCurImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = -m_Dy*m_ImageWidth*sizeof(float);
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step4;当前帧重叠部分除二。
Status =ippmMul_mac_32f_L((const float**)&m_CurImageMat,srcROIShift,srcStride1,0.5,
&m_HalfCurImageMat,dstROIShift,dstStride1,
m_ImageWidth-m_Dx,m_ImageHeight+m_Dy,1);
int src1ROIShift = 0;
int src1Stride1 = m_ImageWidth*sizeof(float);
int src2ROIShift = 0;
int src2Stride1 = m_ImageWidth*sizeof(float);
dstROIShift =0;
dstStride1 = m_ImageWidth*sizeof(float);
dstStride2 = 1*sizeof(float);
//step5:重叠部分图像相加。
ippmAdd_mama_32f_L((const float**)&m_HalfOldImageMat,src1ROIShift,src1Stride1,
(const float**)&m_HalfCurImageMat,src2ROIShift,src2Stride1,
&m_AddImageMat,dstROIShift,dstStride1,
m_ImageWidth,m_ImageHeight,1);
srcROIShift = 0;
srcStride1 = m_ImageWidth*sizeof(float);
srcStride2 = 1*sizeof(float);
dstROIShift = m_Dx*sizeof(float);
dstStride1 = (m_GlobalWidth+m_Dx)*sizeof(float);
dstStride2 = 1*sizeof(float);
//step6:重叠部分复制回去。
Status = ippmCopy_ma_32f_LL((const float**)&m_AddImageMat,srcROIShift,srcStride1,srcStride2,
&m_DstImageMat,dstROIShift,dstStride1,dstStride2,
m_ImageWidth,m_ImageHeight,1);
float* mat = m_OldImageMat;
m_OldImageMat = m_DstImageMat;
m_DstImageMat = mat;
//更新拼接图的宽度和高度。
if(m_Dx<=0)
{
m_GlobalWidth = m_GlobalWidth - m_Dx;
}
else
{
m_GlobalWidth = m_GlobalWidth + m_Dx;
}
if(m_Dy<=0)
{
m_GlobalHeight = m_GlobalHeight - m_Dy;
}
else
{
m_GlobalHeight = m_GlobalHeight + m_Dy;
}
// ShowImage();
}
ShowImage();
}
void CUltraSoundView::ShowImage()
{
CUltraSoundDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//////////////////////////////////////////////////////////////////////////////////
//图像显示。
// if(m_Dx <= 0 && m_Dy <=0)
// {
// m_Dx = 0;
// m_Dy = 0;
int addpix = 0;
int mod = m_GlobalWidth%4;
if(mod!=0)
{
addpix = 4 - mod;
}
int srcROIShift = 0;
int srcStride1 = (m_GlobalWidth)*sizeof(float);
int srcStride2 = 1*sizeof(float);
int dstROIShift = addpix*sizeof(float);
int dstStride1 = (m_GlobalWidth + addpix)*sizeof(float);
int dstStride2 = 1*sizeof(float);
IppStatus Status = ippmCopy_ma_32f_LL((const float**)&m_OldImageMat,srcROIShift,srcStride1,srcStride2,
&m_ShowImageMat,dstROIShift,dstStride1,dstStride2,
m_GlobalWidth,m_GlobalHeight,1);
CvSize size;
size.width = m_GlobalWidth + addpix;
size.height = m_GlobalHeight;
if(m_EndImg!=NULL)
cvReleaseImage(&m_EndImg);
m_EndImg = cvCreateImage(size, IPL_DEPTH_8U, 1 );
char* pointer1 = m_EndImg->imageData;
float* pointer2 = m_ShowImageMat;
for(int endheight=0;endheightm_pImageList[0]->imageSize,0,m_ShowImageMat,
pDoc->m_pImageList[0]->imageSize,pDoc->m_pImageList[0]->imageSize,5);
Status = ippmMul_mc_32f(m_DstImageMat,pDoc->m_pImageList[0]->imageSize,0,m_DstImageMat,
pDoc->m_pImageList[0]->imageSize,pDoc->m_pImageList[0]->imageSize,5);
Invalidate();
}
void CUltraSoundView::OnUpdateStart(CCmdUI* pCmdUI)
{
CUltraSoundDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pCmdUI->Enable (pDoc->m_ImgNum > 0);
}
void CUltraSoundView::ShowImageGray(IplImage* pImage, int xpos, int ypos)
{
uchar* data = 0;
int step = 0;
CvSize size;
cvGetRawData( pImage, &data, &step, &size );
IplImage* tempImg = cvCreateImage( size, IPL_DEPTH_8U, 4 );
cvCvtColor(pImage, tempImg, CV_GRAY2RGBA);
cvGetRawData( tempImg, &data, &step, &size );
CDC* pDC = GetDC();
CBitmap bitmap;
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC, size.width, size.height);
bitmap.SetBitmapBits(size.width*size.height*4, data);
dcMemory.SelectObject(&bitmap);
pDC->BitBlt(xpos, ypos, size.width, size.height, &dcMemory, 0, 0, SRCCOPY);
cvReleaseImageHeader(&tempImg);
}
BOOL CUltraSoundView::OnEraseBkgnd(CDC* pDC)
{
return true;
}