SR4000自带软件修改(二)
/*-----------------------------------------------------------------------------
*
* 版权声明:
* 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
* http://www.cnblogs.com/yuliyang/
* 联系方式:
* Mail:yuliyang@qq.com
*
*-----------------------------------------------------------------------------*/
实现功能:
- 录制视频。
/*
* =====================================================================================
*
* Filename: SwissRangerSampleGui.cpp
* Environment:
* Description: 使用opencv获取深度和幅度数据并且录制视频
*
*
* Version: 1.0
* Created: 2013/11/6 21:55:43
* Author: yuliyang
I*
* Mail: wzyuliyang911@gmail.com
* Blog: http://www.cnblogs.com/yuliyang
*
* =====================================================================================
*/ #include "stdafx.h"
//#include <vld.h>
#include "SwissRangerSampleGui.h"
#include "commdlg.h"
#include "commctrl.h"
#pragma comment( lib, "comctl32" ) //Used for slider control
#include "richedit.h"
#include <math.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
/*------------------------------------------------------------------------------------------------------------
* rgb2gray用到
*------------------------------------------------------------------------------------------------------------*/
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/core/core_c.h"
#include "opencv2/highgui/highgui_c.h"
using namespace cv;
CvVideoWriter *distance_vedio; /* 写入距离 */
CvVideoWriter *amp_vedio; /* 写入幅度 */
IplImage *video_a; /* 幅度数据的临时图像 */
IplImage *video_d; /* 距离数据的临时图像 */
IplImage *tempbule; /* 蓝色单通道 */
IplImage *tempgreen; /* 绿色单通道 */
IplImage *tempred; /* 红色单通道 */
IplImage *tempbule_A; /* 幅度(Amp)室外蓝色单通道 */
IplImage *tempgreen_A; /* 幅度彩色图像的绿色通道 */
IplImage *tempred_A; /* 幅度彩色图像的红色通道 */
IplImage *temprgb; /* 距离图像(D)的彩色如何图像 */
IplImage *temprgb_A; /* 幅度彩色融合图像 */
IplImage *tempgray; /* 距离图像的灰度图 */
IplImage *tempgray_A; /* 幅度图像的灰度图 */
bool start_flag(false); /* 未用到 */
bool stop_flag(false); /* 未用到 */
HANDLE hT=NULL;
/*------------------------------------------------------------------------------------------------------------
* 本打算用子线程录制视频的,但是没用到
*------------------------------------------------------------------------------------------------------------*/
DWORD WINAPI ThreadFunction(LPVOID lpParameter)
{ while (TRUE){
if (video_a==NULL)
{
video_a=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,1);
video_d=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,3); }
else{
/*cvWriteFrame(distance_vedio,video_d);
cvWriteFrame(amp_vedio,video_a);*/
// video_a=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,1);
// video_d=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,3);
cvShowImage("0",video_a);
cvShowImage("1",video_d);
} }
MessageBox(NULL,"helo","sd",MB_OK);
return true;
} #ifndef DOXYGEN //exclude these defines from doxygen
// Global Variables:
static HINSTANCE hInst; // current instance HINSTANCE AfxGetInstanceHandle(){return hInst;} CPreciseTimer precTimer; #define LIMIT(val,min,max) (((val)<(min))?(min):(((val)>(max))? (max):(val))) #ifndef D3DCOLOR_ARGB
typedef DWORD D3DCOLOR; //!<32 bit color value
#define D3DCOLOR_ARGB(a,r,g,b) \
((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
#endif //Colors for error overflow etc.
#define OVFL_COL D3DCOLOR_ARGB(0,0xff,0xe0,0xc0)
#define UDFL_COL D3DCOLOR_ARGB(0,0xc0,0xe0,0xff)
#define ERR_COL D3DCOLOR_ARGB(0,0x00,0xe0,0x00)
#endif //DOXYGEN //!The RGBColMap struct is used to generate colormaps.
//!This is a local class in the file OCTViewSlice.cpp
typedef struct
{
BYTE pos;//!<position in the color shading
BYTE r; //!<red value
BYTE g; //!<green value
BYTE b; //!<blue value
} RGBColMap; //!<colormap entry for SetColormap() static const RGBColMap jet[]={
{0x00, 0x00, 0x00, 0x80},
{0x20, 0x00, 0x00, 0xff},
{0x60, 0x00, 0xff, 0xff},
{0xa0, 0xff, 0xff, 0x00},
{0xe0, 0xff, 0x00, 0x00},
{0xff, 0x80, 0x00, 0x00}
}; //!fills a folormap with a desired color shading
void SetColormap(const RGBColMap* cm, RGBQUAD* col)
{
int i,x;
float f;
col[0].rgbBlue =(BYTE)cm[0].b;
col[0].rgbGreen=(BYTE)cm[0].g;
col[0].rgbRed =(BYTE)cm[0].r;
col[0].rgbReserved=0x00;
x=1;
for (i=1;i<256;i++)
{
while (cm[x].pos<i)x++;
f=((float)i-cm[x-1].pos)/(cm[x].pos-cm[x-1].pos);
col[i].rgbBlue =(BYTE)(f*cm[x].b+(1.-f)*cm[x-1].b);
col[i].rgbGreen=(BYTE)(f*cm[x].g+(1.-f)*cm[x-1].g);
col[i].rgbRed =(BYTE)(f*cm[x].r+(1.-f)*cm[x-1].r);
col[i].rgbReserved=0x00;
}
} //!Loops and calls CWndSwissranger::Acquire() until CCameraThread::Stop() is called
DWORD CCameraThread::CameraLoop()
{
while(!_stop)
{
_srWnd->Acquire();
}
return 0;
} const TCHAR* CWndSwissranger::_wndClass="WndSwissrangerClass";
const TCHAR* CWndSwissranger::_wndTitle="Swissranger"; //!\ingroup swissRangerSampleGui
//!This is he main entry function that allocates a CWndSwissranger object, creates the window and starts the message loop.
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WINDOWINFO winf;
HACCEL hAccelTable;
HWND dlg;
hInst = hInstance;
InitCommonControls(); SR_CheckForNewDllVersion(0); CWndSwissranger wndSR; wndSR.Create(hInstance,0);
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SWISSRANGERSAMPLEGUI); // Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (TranslateAccelerator(msg.hwnd, hAccelTable, &msg))continue; dlg=msg.hwnd;
while(IsWindow(dlg) && GetWindowInfo(dlg,&winf))
{
if ((winf.dwStyle&WS_POPUP) && IsDialogMessage(dlg, &msg))
{
goto cont2;
}
dlg=GetParent(dlg);
}
TranslateMessage(&msg);
DispatchMessage(&msg);
cont2:;
}
return (int) msg.wParam;
} //!redirects the call from this static function to the method WindowProc
BOOL CALLBACK CDlgAbout::SWindowProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CDlgAbout* pWnd;
if (message == WM_INITDIALOG)
{
pWnd=(CDlgAbout*)lParam;
pWnd->_hWnd=hDlg;
// get the pointer to the window from lpCreateParams which was set in CreateWindow
SetWindowLong(hDlg, GWL_USERDATA, (long)(lParam));
pWnd->OnInitialUpdate();
return TRUE;
}
// get the pointer to the window
pWnd = GetObjectFromWindow(hDlg);
// if we have the pointer, go to the message handler of the window
// else, use DefWindowProc
if (pWnd)
return pWnd->WindowProc(hDlg, message, wParam, lParam);
else
return FALSE;
} //!window message handling function
BOOL CALLBACK CDlgAbout::WindowProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
} CWndSwissranger* CWndSwissranger::_cbInstance=0;
//!registers a new window class
ATOM CWndSwissranger::RegisterClass(HINSTANCE hInstance)
{
static bool registered=false;
if(registered)return 0;
registered=true;
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
//wcex.lpfnWndProc = SWindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SWISSRANGERSAMPLEGUI);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_SWISSRANGERSAMPLEGUI;
wcex.lpszClassName = _wndClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
} //!redirects the call from this static function to the method WindowProc
BOOL CALLBACK CWndSwissranger::SWindowProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CWndSwissranger* pWnd;
if (message == WM_INITDIALOG)
{
pWnd=(CWndSwissranger*)lParam;
pWnd->_hWnd=hDlg;
// get the pointer to the window from lpCreateParams which was set in CreateWindow
SetWindowLong(hDlg, GWL_USERDATA, (long)(lParam));
pWnd->OnInitialUpdate();
return TRUE;
}
// get the pointer to the window
pWnd = GetObjectFromWindow(hDlg);
// if we have the pointer, go to the message handler of the window
// else, use DefWindowProc
if (pWnd)
return pWnd->WindowProc(hDlg, message, wParam, lParam);
else
return FALSE;
} //!window message handling function
BOOL CALLBACK CWndSwissranger::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent; switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDOK:
case IDCANCEL:
{
_camThread.Stop(1000);
if(IsWindowEnabled(::GetDlgItem(hWnd,IDC_CLOSE)))
{
OnCloseDev();
}
DestroyWindow(hWnd);
break;
}
case IDM_ABOUT:
{
CDlgAbout about;
about.DoModal(AfxGetInstanceHandle(),hWnd);
break;
}
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_SETTINGS_DLL:
{
if(_srCam)
SR_OpenSettingsDlg(_srCam,hWnd);
else
{
MessageBox(hWnd,"No Swissranger camera opened","Warning",MB_ICONEXCLAMATION);
}
break;
}
case IDC_CHECK_NEW_DLL:
{
int res=SR_CheckForNewDllVersion(3);
if(res)
MessageBox(hWnd,"No new libMesaSR-dll version found","libMesaSR: Info",MB_ICONASTERISK);
break;
} case ID_OPEN_FORCE_DLG:
{
OnOpenDlg(2);
break;
}
case IDC_OPEN:
case ID_OPEN_DLG:
{
short s=GetKeyState(VK_LSHIFT);
if(s<0)//shift pressed?
OnOpenDlg(2);
else
OnOpenDlg(3);
break;
}
case IDC_ACQUIRE:
{
//_camThread.Run(this);
HWND hcntrl=GetDlgItem(hWnd,IDC_CONTINUOUS);
LRESULT lResult = SendMessage(hcntrl, BM_GETCHECK, 0, 0);
if(lResult)
{
if(_camThread.IsRunning())
{
_camThread.Stop(0);
EnableWindow(::GetDlgItem(hWnd,IDC_CLOSE),TRUE);
::SendMessage(::GetDlgItem(hWnd,IDC_ACQUIRE),WM_SETTEXT,0,(LPARAM)"Acquire");
}
else
{
EnableWindow(::GetDlgItem(hWnd,IDC_CLOSE),FALSE);
::SendMessage(::GetDlgItem(hWnd,IDC_ACQUIRE),WM_SETTEXT,0,(LPARAM)"Stop");
precTimer.StartTimer();
_camThread.Run(this);
}
}
else
{
precTimer.StartTimer();
Acquire();
}
break;
}
case IDC_CLOSE:
{
OnCloseDev();
break;
}
case IDC_MINCOL:
{
HWND hcntrl=(HWND)lParam;
switch(wmEvent)
{
case EN_CHANGE:
{
char buf[64];
HWND hcntrl=(HWND)lParam;
GetWindowText(hcntrl,buf,_countof(buf));
hcntrl=GetDlgItem(hWnd,IDC_CB_COL);
LRESULT lResult = SendMessage(hcntrl,CB_GETCURSEL,0,0);
float v=(float)atof(buf);
_minVal[lResult]=v;
break;
}
}
break;
}
case IDC_MAXCOL:
{
HWND hcntrl=(HWND)lParam;
switch(wmEvent)
{
case EN_CHANGE:
{
char buf[64];
HWND hcntrl=(HWND)lParam;
GetWindowText(hcntrl,buf,_countof(buf));
hcntrl=GetDlgItem(hWnd,IDC_CB_COL);
LRESULT lResult = SendMessage(hcntrl,CB_GETCURSEL,0,0);
float v=(float)atof(buf);
_maxVal[lResult]=v;
break;
}
}
break;
}
case IDC_CB_COL:
{
switch(wmEvent)
{
case CBN_SELCHANGE:
{
HWND hcntrl=(HWND)lParam;
LRESULT lResult = SendMessage(hcntrl,CB_GETCURSEL,0,0);
SetColorLim((int)lResult);
break;
}
}
break;
}
case IDC_AUTO_EXPOSURE:
{
bool optInt=SendMessage(GetDlgItem(_hWnd,IDC_AUTO_EXPOSURE), BM_GETCHECK, 0, 0)?true:false;
if(optInt)
SR_SetAutoExposure(_srCam, 5,255,10,45);
else
SR_SetAutoExposure(_srCam, 255,0,0,0);
break;
}
case IDC_MEDIAN:
{
if(SendMessage((HWND)lParam,(UINT)BM_GETCHECK,0,0)==BST_CHECKED)
SetMode(_acquMode|AM_MEDIAN);
else
SetMode(_acquMode&~AM_MEDIAN);
break;
}
case IDC_CONV_GRAY:
{
if(SendMessage((HWND)lParam,(UINT)BM_GETCHECK,0,0)==BST_CHECKED)
SetMode(_acquMode|AM_CONV_GRAY);
else
SetMode(_acquMode&~AM_CONV_GRAY);
break;
}
case IDC_COORD_TRANSF:
{
HWND hcntrl=GetDlgItem(_hWnd,IDC_COORD_TRANSF);
LRESULT lResult = SendMessage(hcntrl, BM_GETCHECK, 0, 0);
_coordTrf=lResult?true:false;
break;
}
default:
return FALSE; // Didn't process the message: Got a WM_COMMAND message with unknown id.
}
break;
case WM_PAINT:
{
OnPaint();
break;
}
case WM_SIZE:
{
RECT rct0;
RECT cltRct;
HWND imgWnd0=GetDlgItem(hWnd,IDC_IMAGE0);
int w = LOWORD(lParam);
int h = HIWORD(lParam);
TRACE("WM_SIZE %d,%d",w,h);
GetClientRect(hWnd,&cltRct);
GetWindowRect(imgWnd0,&rct0);ScreenToClient(hWnd,(LPPOINT)&rct0);ScreenToClient(hWnd,((LPPOINT)&rct0)+1);
int d=10;
int ww=(cltRct.right-rct0.left-d);
MoveWindow(imgWnd0,
rct0.left,//
rct0.top,//
ww,
cltRct.bottom-rct0.top-d,
true);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE; // Didn't process the message: Got a WM_COMMAND message with unknown id.
}
return TRUE; // processed the message
} //!fills the dib with image data from the camera
/* */
/*------------------------------------------------------------------------------------------------------------
* 主要修改部分by
* yuliyang 2013/11/7 20:27:06
*
*
*
*
*
*------------------------------------------------------------------------------------------------------------*/
void CWndSwissranger::SetDib() /* 该函数在aquire() 图像时重复调用*/
{ /*------------------------------------------------------------------------------------------------------------ *
* 0000-0xffff 扩展到0x000000-0xffffff每种颜色
* 每种颜色占一个字节 00-ff
* 扩张后再分配到各个通道,然后再组装成彩色一幅图
*
*
*
*------------------------------------------------------------------------------------------------------------*/
tempbule=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1); /* 蓝色单通道 */
tempgreen=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1); /* 绿色单通道 */
tempred=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1); /* 红色单通道 */
tempbule_A=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1); /* 幅度室外蓝色单通道 */
tempgreen_A=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1);
tempred_A=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1);
temprgb=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,3);
temprgb_A=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,3);
tempgray=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1);
tempgray_A=cvCreateImage(cvSize(_imgSz.cx,_imgSz.cy),IPL_DEPTH_8U,1);
//IplImage *temp0=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,1);
if (distance_vedio==NULL) /* 第一次是初始化视频读写 */
{
distance_vedio=cvCreateVideoWriter("distance.avi",CV_FOURCC('X','V','I','D'),20,cvSize(_imgSz.cx,_imgSz.cy),1); /* 彩色 */
amp_vedio=cvCreateVideoWriter("amp.avi",CV_FOURCC('X','V','I','D'),20,cvSize(_imgSz.cx,_imgSz.cy),0); /* 灰度 */
}
if (video_a==NULL) /* 图像无数据时 */
{
video_a=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,1); /* 因为获取图像与写入图像有时间差 */
video_d=cvCreateImage(cvSize(176,144),IPL_DEPTH_16U,3);
} cvNamedWindow("distance",CV_WINDOW_AUTOSIZE);
cvNamedWindow("amp",CV_WINDOW_AUTOSIZE);
cvNamedWindow("gray",CV_WINDOW_AUTOSIZE);
cvNamedWindow("amp_gray",CV_WINDOW_AUTOSIZE);
//cvNamedWindow("0",CV_WINDOW_AUTOSIZE);
/*------------------------------------------------------------------------------------------------------------
* 获取距离图像
*
*------------------------------------------------------------------------------------------------------------*/
if(_dibCam)
{
int i,idx,img;
int row=0;
int col=0; float v,minVal,step;
img=0;idx=0;
if(_coordTrf)
{
int res;
float lambda[MF_LAST]={3.75f, 5.f, 7.142857f, 7.5f, 7.894737f, 2.5f, 10.f, 15.f, 5.172414f, 4.838710f, 10.344828f, 9.677419f};//MF_40MHz,MF_30MHz,MF_21MHz,MF_20MHz,MF_19MHz,...
ModulationFrq frq=SR_GetModulationFrequency(_srCam);
res=SR_CoordTrfFlt(_srCam, 0,0,_z, sizeof(float),sizeof(float),sizeof(float));
minVal=_minVal[img];
step=(float)0xff/(_maxVal[img]-_minVal[img]);
for(i=0;i<_imgSz.cx*_imgSz.cy;i++,idx++)
{
row=i/_imgSz.cx;
col=i%_imgSz.cx;
v=(_z[i]*((float)(1<<16)/lambda[frq])-minVal)*step;
_dibCam[idx]=_bmiScale->bmiColors[(BYTE)LIMIT(v,0,255)]; /*------------------------------------------------------------------------------------------------------------
* 获取3个通道的数据分别给opencv图像赋值
*
*------------------------------------------------------------------------------------------------------------*/
BYTE Blue1 =_dibCam[idx].rgbBlue;
BYTE Green1=_dibCam[idx].rgbGreen;
BYTE Red1=_dibCam[idx].rgbRed;
CV_IMAGE_ELEM( tempbule, uchar, row,col )=Blue1;
CV_IMAGE_ELEM( tempgreen, uchar, row,col )=Green1;
CV_IMAGE_ELEM( tempred, uchar, row,col )=Red1; } cvMerge(tempbule,tempgreen,tempred,NULL,temprgb); /* 图像融合 */
cvShowImage("distance",temprgb);
cvCvtColor(temprgb,tempgray,CV_RGB2GRAY);
cvShowImage("gray",tempgray);
video_d=temprgb;
// cvShowImage("1",video_d);
cvWriteFrame(distance_vedio,temprgb); /* 写入视频文件 */
// cvCopy(temprgb,video_d,0);
cvWaitKey(10);
img++;
} /*------------------------------------------------------------------------------------------------------------
* 获取幅度图像
*
*------------------------------------------------------------------------------------------------------------*/ //cvShowImage("1",video_d);
cvWriteFrame(amp_vedio,video_d);
for(;img<_numImg;img++)
{
WORD* p=(WORD*)_imgEntryArray[img].data;
unsigned short int * pdata0;
pdata0=(unsigned short int *)SR_GetImage(_srCam, 1); /* 原数据 */
minVal=_minVal[img];
step=(float)0xff/(_maxVal[img]-_minVal[img]);
for(i=0;i<_imgSz.cx*_imgSz.cy;i++,idx++)
{
int row=i/_imgSz.cx; /* 行 */
int col=i%_imgSz.cx; /* 列 */
v=((float)p[i]-minVal)*step;
_dibCam[idx]=_bmiScale->bmiColors[(BYTE)LIMIT(v,0,255)];
/*------------------------------------------------------------------------------------------------------------
* 幅度数据的赋值
*
*------------------------------------------------------------------------------------------------------------*/
BYTE Blue1 =_dibCam[idx].rgbBlue;
BYTE Green1=_dibCam[idx].rgbGreen;
BYTE Red1=_dibCam[idx].rgbRed;
CV_IMAGE_ELEM( tempbule_A, uchar, row,col )=Blue1;
CV_IMAGE_ELEM( tempgreen_A, uchar, row,col )=Green1;
CV_IMAGE_ELEM( tempred_A, uchar, row,col )=Red1;
}
cvMerge(tempbule_A,tempgreen_A,tempred_A,NULL,temprgb_A);
cvShowImage("amp",temprgb_A); /* 融合 */
cvCvtColor(temprgb_A,tempgray_A,CV_RGB2GRAY);
cvShowImage("amp_gray",tempgray_A);
//cvWriteFrame(amp_vedio,tempgray_A);
// cvCopy(tempgray_A,video_a,0);
video_a=tempgray_A;
cvWaitKey(10);
//for (int i=0;i<144;i++)
//{
// for (int j=0;j<176;j++)
// {
// CV_IMAGE_ELEM( temp0, unsigned short int, i, j)=*pdata0; /* 给图像赋值 */
// pdata0++; // }
//}
//cvShowImage("0",temp0);
//cvWaitKey(10);
}
// cvShowImage("0",video_a);
cvWriteFrame(amp_vedio,video_a); /* 写入幅度视频文件 */ }
InvalidateRect(_hWnd,0,false); /* 重绘窗口 */
cvReleaseImage(&tempbule);
cvReleaseImage(&tempgreen);
cvReleaseImage(&tempred);
cvReleaseImage(&temprgb);
// cvDestroyWindow("distance");
} //!redirects the call from this static function to the method SRFuncCB
int CWndSwissranger::SSRFuncCB(SRCAM srCam, unsigned int msg, unsigned int param, void* data)
{
if(!_cbInstance)
return 0;
return _cbInstance->SRFuncCB(srCam, msg, param, data);
}
//!callback function of the libMesaSR. It enters/leaves the critical section during changes
int CWndSwissranger::SRFuncCB(SRCAM srCam, unsigned int msg, unsigned int param, void* data)
{
switch(msg)
{
default:
return SR_GetDefaultCallback()(srCam,msg,param,data);
break;
case CM_CHANGING:
EnterCritSec();
break;
case CM_CHANGED:
if(param)
AllocObj();
LeaveCritSec();
break;
}
return 0;
} //!allocates memory for _dibCam buffer and initializes the _bmiCam structure
void CWndSwissranger::AllocObj()
{
_imgSz.cx=SR_GetCols(_srCam);
_imgSz.cy=SR_GetRows(_srCam);
_numImg=SR_GetImageList(_srCam,&_imgEntryArray); SAFE_FREE(_dibCam);
_dibCam=(RGBQUAD*)malloc(_imgSz.cx*_imgSz.cy*_numImg*sizeof(RGBQUAD));//RGBQUAD, RGBTRIPLE, BYTE, WORD
_bmiCam->bmiHeader.biWidth =_imgSz.cx;
_bmiCam->bmiHeader.biHeight=-_numImg*_imgSz.cy; SAFE_FREE(_z);
_z=(float*)malloc(_imgSz.cx*_imgSz.cy*sizeof(float));
} //!frees all allocated objects
void CWndSwissranger::Free()
{
SAFE_FREE(_dibCam);
SAFE_FREE(_bmiCam);
SAFE_FREE(_dibScale);
SAFE_FREE(_bmiScale);
SAFE_FREE(_z); } //!initializes _maxVal,_bmiCam, _bmiScale and allocates _dibScale
void CWndSwissranger::Initialize()
{
int i;
for(i=0;i<_countof(_minVal);i++)
{
_minVal[i]=0;
_maxVal[i]=0xffff;
}
_maxVal[0]=30000.f;
_maxVal[1]=15000.f;
_maxVal[2]=30000.f;
_maxVal[3]=15000.f; _bmiCam=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+1*sizeof(RGBQUAD));
memset(_bmiCam,0,sizeof(BITMAPINFOHEADER));
_bmiCam->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
_bmiCam->bmiHeader.biPlanes = 1;
_bmiCam->bmiHeader.biBitCount = 32;
_bmiCam->bmiHeader.biCompression = BI_RGB; _bmiScale=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
memset(_bmiScale,0,sizeof(BITMAPINFOHEADER));
_bmiScale->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
_bmiScale->bmiHeader.biPlanes = 1;
_bmiScale->bmiHeader.biBitCount = 8;
_bmiScale->bmiHeader.biCompression = BI_RGB;
_bmiScale->bmiHeader.biWidth=256;
_bmiScale->bmiHeader.biHeight=1; //alloc and fill scale DIB
int x;
_dibScale=(BYTE*)malloc(256*sizeof(BYTE));
for (x=0;x<256;x++)_dibScale[x]=x;
SetColormap(jet,_bmiScale->bmiColors);
}
//!When the window is created this function will be called
void CWndSwissranger::OnInitialUpdate()
{
LRESULT lResult;
HWND hcntrl;
int i;
char buf[64]; HICON hIcon=LoadIcon(hInst, (LPCTSTR)IDI_SMALL);
lResult = SendMessage(_hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
lResult = SendMessage(_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); hcntrl=GetDlgItem(_hWnd,IDC_CB_COL);
for(i=0;i<_countof(_minVal);i++)
{
_snprintf(buf,_countof(buf),"Image %d",i);
lResult = SendMessage(hcntrl,CB_INSERTSTRING,-1,(LPARAM)buf);
}
lResult = SendMessage(hcntrl,CB_SETCURSEL,0,0);
SetColorLim(0);
hcntrl=GetDlgItem(_hWnd,IDC_CONTINUOUS);
lResult = SendMessage(hcntrl, BM_SETCHECK, BST_CHECKED, 0);
hcntrl=GetDlgItem(_hWnd,IDC_COORD_TRANSF);
lResult = SendMessage(hcntrl, BM_SETCHECK, BST_CHECKED, 0);
_coordTrf=true;
} //!Sets the acuire mode of the camera
void CWndSwissranger::SetMode(int mode)
{
EnterCritSec();
_acquMode=mode;
SR_SetMode(_srCam, mode);
LeaveCritSec();
}
//!Sets color limits _minVal[idx] and _maxVal[idx] according to the gui settings
void CWndSwissranger::SetColorLim(int idx)
{
HWND hcntrl;
char buf[64];
hcntrl=GetDlgItem(_hWnd,IDC_MINCOL);
_snprintf(buf,_countof(buf),"%.2f",_minVal[idx]);
SetWindowText(hcntrl,buf);
hcntrl=GetDlgItem(_hWnd,IDC_MAXCOL);
_snprintf(buf,_countof(buf),"%.2f",_maxVal[idx]);
SetWindowText(hcntrl,buf);
}
//!called when close button is pressed
/*------------------------------------------------------------------------------------------------------------
* 释放视频文件
*
*
*
*------------------------------------------------------------------------------------------------------------*/
void CWndSwissranger::OnCloseDev()
{
/*------------------------------------------------------------------------------------------------------------
* 重要:如果不释放的话得到的视频文件大小是不对的只有6K大小
*
*
*------------------------------------------------------------------------------------------------------------*/
cvReleaseVideoWriter(&distance_vedio); /* 释放距离视频资源 */
cvReleaseVideoWriter(&_vedio); /* 释放幅度图像资源 */
int res;
TRACE("swissrangerTester: SR_Close");
res=SR_Close(_srCam);
EnableWindow(::GetDlgItem(_hWnd,IDC_OPEN),TRUE);
if (res < 0)
{
TRACE("Failed to close device: error %d",res);
//but change the button states anyway, no return;
}
EnableWindow(::GetDlgItem(_hWnd,IDC_CLOSE),FALSE);
EnableWindow(::GetDlgItem(_hWnd,IDC_ACQUIRE),FALSE);
_srCam=0;//there are no valid device opened
} //!called on a \b WM_PAINT message
void CWndSwissranger::OnPaint()
{
char buf[256];
_snprintf(buf,_countof(buf)," %.2f fps\n",1.f/_timePerFrame);
HWND hcntrl=GetDlgItem(_hWnd,IDC_TX_FPS);
::SetWindowText(hcntrl,buf); PAINTSTRUCT ps;
HDC hdc;
HWND imgWnd;
hdc = BeginPaint(_hWnd, &ps);
EndPaint(_hWnd, &ps);
imgWnd=GetDlgItem(_hWnd,IDC_IMAGE0); /*------------------------------------------------------------------------------------------------------------
* 删除掉了DC的绘图操作代码
*
*
*------------------------------------------------------------------------------------------------------------*/
//hdc = BeginPaint(imgWnd, &ps);
//RECT rect;
//GetClientRect(imgWnd,&rect);
//float fct;
//if(_dibScale)
//{
// const SIZE sz={_bmiScale->bmiHeader.biWidth,_bmiScale->bmiHeader.biHeight};
// fct=(float)(rect.right-10)/sz.cx;
// StretchDIBits(hdc, 5, 5, (int)(fct*sz.cx), 10, 0, 0, // x,y,w,h destination // x,y source
// _bmiScale->bmiHeader.biWidth, _bmiScale->bmiHeader.biHeight, // width & height in source
// _dibScale, _bmiScale, // pointer to 'bits' //BITMAPINFOHEADER
// DIB_RGB_COLORS, SRCCOPY);
//} //if(_dibCam)
//{
// const SIZE sz={_bmiCam->bmiHeader.biWidth,-_bmiCam->bmiHeader.biHeight};
// fct=min((float)(rect.right-10)/sz.cx,(float)(rect.bottom-25)/sz.cy);
// StretchDIBits(hdc, 5, 20, (int)(fct*sz.cx), (int)(fct*sz.cy), 0, 0, // x,y,w,h destination // x,y source
// _bmiCam->bmiHeader.biWidth, -_bmiCam->bmiHeader.biHeight, // width & height in source
// _dibCam, _bmiCam, // pointer to 'bits' //BITMAPINFOHEADER
// DIB_RGB_COLORS, SRCCOPY);
//} //EndPaint(imgWnd, &ps);
return;
} //!called when open button is pressed
void CWndSwissranger::OnOpenDlg(int mode)
{
TRACE("swissrangerTester: SR_Open device");
if (_srCam)
{
TRACE("Swiss Ranger device already opened.");
return;
}
int res;
res=SR_OpenDlg(&_srCam,mode,_hWnd);
SendMessage(GetDlgItem(_hWnd,IDC_AUTO_EXPOSURE), BST_UNCHECKED, 0, 0);
_acquMode=SR_GetMode(_srCam); SendMessage((HWND)GetDlgItem(_hWnd,IDC_MEDIAN),(UINT)BM_SETCHECK, (_acquMode&AM_MEDIAN)?BST_CHECKED:BST_UNCHECKED,0);
SendMessage((HWND)GetDlgItem(_hWnd,IDC_CONV_GRAY),(UINT)BM_SETCHECK, (_acquMode&AM_CONV_GRAY)?BST_CHECKED:BST_UNCHECKED,0); if (res<=0)
{
TRACE("Couldn't connect to Swiss Ranger device error %d",res);
return;
}
TRACE("swissrangerTester: Device opened successfully device handle=%d",_srCam);
AllocObj();
EnableWindow(::GetDlgItem(_hWnd,IDC_OPEN),FALSE);
EnableWindow(::GetDlgItem(_hWnd,IDC_CLOSE),TRUE);
EnableWindow(::GetDlgItem(_hWnd,IDC_ACQUIRE),TRUE);
} //!Acquires an image and displays it
void CWndSwissranger::Acquire()
{ EnterCritSec();
int res=SR_Acquire(_srCam); if (res < 0)
{
TRACE("Failed to acquire the measurement");
}
else
{
//logPrintf("swissrangerTester: %d bytes read", res);
SetDib();
}
LeaveCritSec();
__int64 tic=precTimer.GetTime();precTimer.StartTimer();
static __int64 smtic=0;
_timePerFrame=0.90f*_timePerFrame+0.10f*(float)tic/1e6f;
smtic+=tic;
smtic=0;
}
SR4000自带软件修改(二)的更多相关文章
- 修改SR4000自带软件,支持opencv
/*----------------------------------------------------------------------------- * * 版权声明: * 可以任意转载 ...
- 删除Android自带软件方法及adb remount 失败解决方案
删除Android自带软件方法 1.在电脑上打开cmd,然后输入命令 adb remount adb shell su 2.接着就是Linux命令行模式了,输入 cd system/app 3然后输入 ...
- Java生成带小图标的二维码-google zxing 工具类
近期一直忙于开发微信商城项目,应客户要求,要开发个有图标的二维码.经过两次改版,终于实现了该功能(第一次没有小图标,这次才整合好的),如下是完整代码 . 该代码使用Java7开发,另外使用 core- ...
- Force.com微信开发系列(八)生成带参数的二维码
为了满足用户渠道推广分析的需要,公众平台提供了生成带二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送.目前有两种类型的二维码,分别是临时二维码和永久二维码 ...
- C#生成带logo的二维码
带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码. 生成的二维码效果如下: 下面直接贴出二维码生成类 QRCode ...
- js生成带参的二维码
最近项目中有需求生成带参的二维码,考虑过用JAVA后台生成返回前端展示,后面了解到用jquery的qrcode.js插件可以很好现实 引入js: require.config({ baseUrl : ...
- .NET生成带Logo的二维码
使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...
- 制作、解析带logo的二维码
用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. -------- ...
- C#微信公众号接口开发实例-高级接口-申请带参数的二维码
最近公司涉及到微信绑定用户,做了高级接口-申请带参数的二维码,总结了下微信开发接口.微信接口开发都是除了消息用的xml 回复基本上都是用json的形式传递信息(post/get),开发的方法基本都是一 ...
随机推荐
- lamp 中基本配置常识
// apache// 禁止访问目录// 开启 url重写// 重写定义错误页面// 日志分页// 增加并发连接数// 设置连接连接的时间 // threadsPerChild // 每个进程的线程数 ...
- jquery 循环显示div的示例代码
我们用一个语句就让下面五个div显示成功,具体实现如下,感兴趣的朋友可以参考下 直接看例子 复制代码代码如下: for(var p=1; p<=5; p++){ $("#proper ...
- R中逻辑运算
一.是否相等的判断的方法 (1)判断字符串是否相等is.null(x) (2)判断x的每个元素是否在y中出现: x %in% y (3)判断判断每个相对应的元素是否相等: x == y (4)判断近似 ...
- can't add foreign key in mysql?
create table department (dept_name ), building ), budget numeric(,) ), primary key (dept_name) ); cr ...
- NetBeans8 类编缉器及控制台中文乱码解决
1.类编辑器中文乱码的解决: 工具-->选项-->字体和颜色-->"语法"选项卡:右侧选择字体的地方设置一个支持中文的字体,如宋体.新宋体.微软雅黑等 2.控制台 ...
- ***微信浏览器禁止app下载链接怎么办
通过扫描二维码下载APP已成为一个非常方便的方式,微信也成为扫描二维码重要的工具,但是扫描后微信浏览器会对APK和appStore的链接进行屏蔽,导致用户无法正常下载.本文提供两个迂回的解决方案:1. ...
- cat命令常用的13个技巧
在Linux系统中,大多数配置文件.日志文件,甚至shell脚本都使用文本文件格式,因此,Linux系统存在着多种文本编辑器,但当你仅仅想要查看一下这些文件的内容时,可使用一个简单的命令-cat. c ...
- 汇编函数调用中bp和sp是指什么?
bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址sp是栈顶指针,它每次指向栈顶.每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值.像下面这样:在函数进 ...
- RxJava开发精要5 – Observables变换
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
- C语言中的宏总结
宏定义分为两种: 1.变量式宏定义,如 #define abc def #define str "string" #define num 100 2.函数式宏定义, #define ...