imageobjectdlg.cpp

来自「实时视频捕获」· C++ 代码 · 共 1,641 行 · 第 1/4 页

CPP
1,641
字号
	return true;
}
bool CImageObjectDlg::SaveParameter()
{
	FILE * fp;
	char szFileName[20];
	//保存参数到文件
	sprintf(szFileName, "c:\\detectconfig.cfg");
	fp = fopen(szFileName, "wb");
	if(!fp)	return false;
	fwrite(&m_SysSetPara, sizeof(SystemSetParameter), 1, fp);
	fclose(fp);
	return true;
}
bool CImageObjectDlg::InitVideoCaptureCard()
{
	HRESULT hr;
	BOOL bConnectOk;
	VIDEOSTREAMINFO vsi;
	bool result=TRUE;
	VIDEOPROPERTYRANGE *pVPR=new VIDEOPROPERTYRANGE;
	int devicenum;
	hr = DSStream_GetCardNumber(&devicenum);
	if(FAILED(hr) || devicenum<2)
	{
		AfxMessageBox(_T(" 无可用的卡"), MB_OK|MB_ICONSTOP, 0);
		return false;
	}
	hr = DSStream_IsConnected(0, &bConnectOk);
	if(SUCCEEDED(hr) ||! bConnectOk)
	{
		DSStream_ConnectDevice(0, TRUE);
		//设置视频制式
		DSStream_SetVideoStandard(0, VideoStandard_PAL_B);
		//设置视频源
		DSStream_RouteInPinToOutPin(0, 1, 0);
		//设置视频属性:亮度、对比度、色度、饱和度
		DSStream_SetVideoPropertyValue(0, VideoProperty_Hue,5000);
		DSStream_SetVideoPropertyValue(0, VideoProperty_Saturation, 5000);
		DSStream_SetVideoPropertyValue(0, VideoProperty_Brightness,5000 );
		DSStream_SetVideoPropertyValue(0, VideoProperty_Contrast,5000 );
		DSStream_GetVideoInfo(0, &vsi, PREVIEW);//PREVIEW);CAPTURE
		vsi.subtype = VideoSubType_RGB24;
		vsi.bmiHeader.biWidth= IMAGE_WIDTH;
		vsi.bmiHeader.biHeight=IMAGE_HEIGHT;
		vsi.AvgTimePerFrame=10000000/30;
		DSStream_DisconnectPin(0, PREVIEW);//CAPTURE);//PREVIEW
		DSStream_SetVideoInfo(0, vsi,  PREVIEW);//CAPTURE);// 
		DSStream_DisconnectDevice(0);	
	}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	hr = DSStream_IsConnected(m_CardID, &bConnectOk);
	if(FAILED(hr) || bConnectOk)
	{
		AfxMessageBox(_T(" 无可用的卡"), MB_OK|MB_ICONSTOP, 0);
		return false;
	}
	hr = DSStream_ConnectDevice(m_CardID, FALSE);
	if(FAILED(hr) || bConnectOk)
	{
		AfxMessageBox(_T(" 连接失败"), MB_OK|MB_ICONSTOP, 0);
		return false;
	}
	hr = DSStream_IsConnected(m_CardID, &bConnectOk);
	if(FAILED(hr) || !bConnectOk)
		return false;
	
	//创建视频预览窗口
	CRuntimeClass   *pRunTimeClass=RUNTIME_CLASS(CChildFrame); 
	m_lpShowVideoWnd=(CChildFrame*)pRunTimeClass-> CreateObject(); 
	CREATESTRUCT   cs; 
	cs.lpszClass=0; 
	m_lpShowVideoWnd-> PreCreateWindow(cs); 
	WNDCLASS   wcl; 
	GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wcl); 
	wcl.lpszClassName=_T( "my  class "); 
	wcl.hbrBackground=HBRUSH(6); 
	::RegisterClass(&wcl); 
	m_lpShowVideoWnd->CreateEx(NULL,wcl.lpszClassName, 
				_T("我的窗口"),WS_OVERLAPPED|WS_OVERLAPPEDWINDOW, 
				CRect(100,100,300,300),this,NULL,NULL); 
	//	CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR  lpszWindowName,
	//  DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,   
	//  UINT nID, LPVOID lpParam= NULL); 
//	m_lpShowVideoWnd->SetOwner(this);
	m_lpShowVideoWnd-> ShowWindow(SW_HIDE); //SW_HIDE SW_SHOW
	m_lpShowVideoWnd-> UpdateWindow();
	m_lpShowVideoWnd->m_iCardID=m_CardID;
	m_lpShowVideoWnd->m_bOverlay=FALSE;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	DSStream_SetOwnerWnd(m_CardID, m_lpShowVideoWnd->m_hWnd);
	DSStream_SetMessageDrain(m_CardID, m_lpShowVideoWnd->m_hWnd);
	DSStream_SetNotifyWindow(m_CardID, m_lpShowVideoWnd->m_hWnd, UM_VIDEO_ERROR_NOTIFY);
	//设置视频制式
	DSStream_SetVideoStandard(m_CardID, VideoStandard_PAL_B);
	//设置视频源
	DSStream_RouteInPinToOutPin(m_CardID, 1, 0);
	//设置视频属性:亮度、对比度、色度、饱和度
	DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Hue,5000);
	DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Saturation, 5000);
	int temp;
	if(m_SysSetPara.image_contrast>100)
		m_SysSetPara.image_contrast=50;
	if(m_SysSetPara.image_light>100)
		m_SysSetPara.image_light=50;
	DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Brightness,m_SysSetPara.image_light*100 );
	DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Contrast,m_SysSetPara.image_contrast *100);

	hr=DSStream_GetVideoInfo(m_CardID, &vsi, PREVIEW);
	vsi.subtype = VideoSubType_RGB24;
	vsi.bmiHeader.biWidth= IMAGE_WIDTH;
	vsi.bmiHeader.biHeight=IMAGE_HEIGHT;
	vsi.AvgTimePerFrame=10000000/30;
	DSStream_DisconnectPin(m_CardID, PREVIEW);//CAPTURE);//PREVIEW
	DSStream_SetVideoInfo(m_CardID, vsi,  PREVIEW);//CAPTURE); 
	DSStream_ConnectPin(m_CardID, PREVIEW);//CAPTURE);//PREVIEW
	int status;
	hr=DSStream_GetStreamStatus(m_CardID,&status);
	if(SUCCEEDED(hr)&&(status!=RUN))
	{
		DSStream_SetStreamStatus(m_CardID,RUN);
	}
///	hr=DSStream_GetVideoStream(m_CardID, VideoStreamCallbak,this->m_hWnd);
	return result;
}
LRESULT CImageObjectDlg::ImageProcess(  WPARAM wParam, LPARAM lParam)
{
	CRect showrect(0,0,0,0);
//	m_bmpMain.GetBitmapBits(m_lpbmiVideo->bmiHeader.biSizeImage,m_bufferVideo);

//	m_ShowImage.GetWindowRect(showrect);
//	CClientDC dc(FromHandle(m_ShowImage.m_hWnd));
//	CDC *dc=GetDC();
//	::SetDIBitsToDevice(dc.m_hDC,0 ,0 ,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,0,m_lpbmiVideo->bmiHeader.biHeight,m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS);//m_bufferVideo  lpcallbakdata
//	dc.SelectObject(&m_bmpMain);
//	dc.StretchBlt(0,0,IMAGE_WIDTH,IMAGE_HEIGHT,&dc,0,0,m_lpbmiVideo->bmiHeader.biWidth,m_lpbmiVideo->bmiHeader.biHeight,SRCCOPY);
//	::StretchDIBits(dc.m_hDC,0 ,0 ,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,m_lpbmiVideo->bmiHeader.biWidth,m_lpbmiVideo->bmiHeader.biHeight,(VOID *)lParam,m_lpbmiVideo,DIB_RGB_COLORS,SRCCOPY);
//	ReleaseDC(dc);
	
//	memcpy(m_lpbmiVideo,(BYTE*)wParam,40);
//	memcpy(m_bufferVideo,(BYTE*)lParam,((BITMAPINFOHEADER*)wParam)->biSizeImage);
//	long ret=m_bmpMain.SetBitmapBits(m_lpbmiVideo->bmiHeader.biSizeImage,(void*)lParam);
//	ret=m_bmpMain.GetBitmapBits(m_lpbmiVideo->bmiHeader.biSizeImage,m_bufferVideo);

	GetRegionImageData();
	for(int i=0;i<m_SysSetPara.detect_num;i++)
	{
		RegionImageProcess(i);
	}
/*
	FILE *lpfile=fopen("d:\\readbak.bin", "w");
	fwrite(m_bufferVideo,1,m_lpbmiVideo->bmiHeader.biSizeImage,lpfile);
		fclose(lpfile);
*/
	DisplayResult();

	return 0; 
}

void CImageObjectDlg::RegionImageProcess(int region_id)
{
	if(region_id>=MAX_DETECT_REGION_NUM)
		return;
	int statu=m_iRegionDetectStatu[region_id];//NO_OBJECT,BEGIN,MIDDLE,END
	int threshold=this->m_SysSetPara.dtr[region_id].threshold;
	int wx=m_SysSetPara.dtr[region_id].region.Width();
	int wy=m_SysSetPara.dtr[region_id].region.Height();
	BYTE *bin=new BYTE[wx];
	AverageFilter1D(m_VAverageLight[region_id],wx,11);
	BinTranslate(m_VAverageLight[region_id],bin,wx,threshold);
	switch(statu)
	{
		case NO_OBJECT:
			if(CheckHeader(bin,wx,threshold))m_iRegionDetectStatu[region_id]=OBJECT_HEAD;
			break;
		case OBJECT_HEAD:
			if(CheckBody(bin,wx,threshold)==2)
			{
				m_iRegionDetectStatu[region_id]=NO_OBJECT;
			}else if(CheckBody(bin,wx,threshold)==1)
			{
				m_iRegionDetectStatu[region_id]=OBJECT_MIDDLE;
			}
			break;
		case OBJECT_MIDDLE:
			if(CheckEnd(bin,wx,threshold))
			{
				m_iRegionDetectStatu[region_id]=OBJECT_TAIL;
				m_iDetectCountTotal++;
				m_iDetectCountTemp++;
				CFile fileDeliver;
				if(fileDeliver.Open(_T("C:\\file.txt"),CFile::modeReadWrite |CFile::osWriteThrough,NULL))
				{
					char *buffer=new char[20];
					int k;
					int readnum=fileDeliver.Read(buffer,20);
					if(readnum)
					{
						k=atoi(buffer);
						k+=m_iDetectCountTemp;
					}else
					{
						k=0;
					}
					_itoa(k,buffer,10);
					fileDeliver.SeekToBegin();
					fileDeliver.Write(buffer,20);
					fileDeliver.Close();
					m_iDetectCountTemp=0;
					delete []buffer;
				}
			}	
			break;
		case OBJECT_TAIL:
			if(CheckHeader(bin,wx,threshold))
			{
				m_iRegionDetectStatu[region_id]=OBJECT_HEAD;
			}else
			{
				m_iRegionDetectStatu[region_id]=NO_OBJECT;
			}
			break;
		default: 
			statu=NO_OBJECT;
			break;
	}
	/*
	m_CurveSpeed++;
	for(int i=0;i<m_SysSetPara.detect_num;i++)
	{
		m_CurveAverage[i]+=m_BrightnessAverage[i];
	}
	if(m_CurveSpeed>=BRIGHT_CURVE_SPEED)
	{
		for(int i=0;i<m_SysSetPara.detect_num;i++)
		{
			m_RegionLightHist[i][m_indexofLightHist]=m_CurveAverage[i]/BRIGHT_CURVE_SPEED;
			m_CurveAverage[i]=0;
		}
		m_indexofLightHist++;
		m_indexofLightHist=m_indexofLightHist%100;
	}
	*/
	delete []bin;
}
void CImageObjectDlg::BinTranslate(BYTE *processData,BYTE *result,long size,int threshold)
{
	for(long i=0;i<size;i++)
	{
		(processData[i]>threshold)?result[i]=255:result[i]=0;
	}
}
void CImageObjectDlg::AverageFilter1D(BYTE *processData,long size,int windowSize)
{
	if(windowSize<3)return;
	if(size<=windowSize)return;
	if(processData==NULL)return;
	long i;
	long value;
	BYTE *buffer=new BYTE[size];
	memcpy(buffer,processData,size);
	for(i=windowSize/2;i<size-(windowSize-1)/2;i++)
	{
		value=0;
		for(int j=-windowSize/2;j<(windowSize+1)/2;j++)
		{
			value+=buffer[i+j];
		}
		value=value/windowSize;
		if(value>255)value=255;
		processData[i]=(BYTE)value;
	}
	delete []buffer;
}
void CImageObjectDlg::MiddleFilter1D(BYTE *processData,long size,int windowSize)
{
	if(windowSize<3)return;
	if(size<=windowSize)return;
	if(processData==NULL)return;
	BYTE * temp= new BYTE [size];
	BYTE * newbuf= new BYTE [windowSize];
	BYTE mid_value;
	long i;
	int k;
	memcpy(temp,processData,size);
	for(i=windowSize/2;i<size-(windowSize-1)/2;i++)
	{
		k=0;
		for(int j=-windowSize/2;j<(windowSize+1)/2;j++)
		{
			newbuf[k++]=temp[i+j];
		}
		for(int m=0;m<windowSize;m++)
		{
			for(int n=0;n<windowSize-m;n++)
			{
				if(newbuf[n]>newbuf[n+1]) 
				{	
					mid_value = newbuf[n];
					newbuf[n]=newbuf[n+1];
					newbuf[n+1]= mid_value;
				}
			}
		}
		processData[i]=newbuf[windowSize/2];
	}
	delete []temp;
	delete []newbuf;
}
bool CImageObjectDlg::CheckHeader(BYTE *processData,long size,int threshold)
{
	int white=0;
	int width_trig=20;
	for(int i=0;i<width_trig;i++)
	{
		if(processData[size-1-i]>threshold)white++;
	}
	if(white>width_trig-3)
	{
		return TRUE;
	}else
	{
		return FALSE;
	}
}
int CImageObjectDlg::CheckBody(BYTE *processData,long size,int threshold)
{
	int white=0;
	int width_trig=20;
	for(int i=0;i<size;i++)
	{
		if(processData[size-1-i]>threshold)
			white++;
	}
	if(white>size-5)
	{
		return 1;
	}else if(white<5)
	{
		return 2;
	}else 
	{
		return 0;
	}
}
bool CImageObjectDlg::CheckEnd(BYTE *processData,long size,int threshold)
{
	int black=0;
	int width_trig=20;
	int i;
	for( i=0;i<size;i++)
	{
		if(processData[size-1-i]<threshold)break;
	}
	if(i<(size*0.8))
	{
		for(;i<size;i++)
		{
			if(processData[size-1-i]<threshold)
			{
				black++;
			}else 
			{
				break;
			}
		}
		if(black>width_trig)
		{
			return TRUE;
		}else
		{
			return false;
		}
	}else
	{
		return false;
	}
}
int CImageObjectDlg::CheckUpEdge(BYTE *processData,long size,int windowSize)
{
	return 0;
}
int CImageObjectDlg::CheckDownEdge(BYTE *processData,long size,int windowSize)
{
	return 0;
}
void CImageObjectDlg::GetRegionImageData()
{
	long left,right,top,bottom;
	long wx,wy;
	int red,green,blue;
	long index;
	long accamulit;
	long l;
	int imageWidth=m_lpbmiVideo->bmiHeader.biWidth;
	int imageHeight=m_lpbmiVideo->bmiHeader.biHeight;
	if(!m_bufferVideo)
		return;
	BYTE * getRegionBuffer=new BYTE[MAX_REGION_WIDTH*MAX_REGION_HEIGHT];
	
//	this->m_bmpMain.GetBitmapBits(m_lpbmiVideo->bmiHeader.biSizeImage,(void*)m_bufferVideo);
	for(int i=0;i<m_SysSetPara.detect_num;i++)
	{
		left=m_SysSetPara.dtr[i].region.left;
		right=m_SysSetPara.dtr[i].region.right;
//		top=m_lpbmiVideo->bmiHeader.biHeight-m_SysSetPara.dtr[i].region.bottom;//
//		bottom=m_lpbmiVideo->bmiHeader.biHeight-m_SysSetPara.dtr[i].region.top;//
		top=m_SysSetPara.dtr[i].region.top;//
		bottom=m_SysSetPara.dtr[i].region.bottom;//
		wx=m_SysSetPara.dtr[i].region.Width();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?