亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? motion.cpp

?? 《Visual C++數字圖像獲取 處理及實踐應用》一書的源代碼
?? CPP
字號:
#include "GlobalApi.h"
#include "stdafx.h"
#include "cdib.h"
#include "math.h"
/*************************************************************************
 *
 * \函數名稱:
 *   GetFileName()
 *
 * \輸入參數:
 *   CString		strFilePathName		- 圖象的文件名 
 *   int		nCurFrameNum		- 當前幀的圖象文件名
 *
 * \返回值:
 *   CString			- 返回給定幀數的圖象文件名
 *
 * \說明:
 *   該函數根據指定文件路徑名和當前圖象序列的幀數獲取圖象文件名
 *   該函數中需要注意的是,只能讀取0-999幀圖象,圖象為bmp格式,且按照
 *   幀數數字進行存儲,例如第一幀圖象文件名為×××001.bmp,第33幀圖象
 *   的文件名為×××033.bmp。如果不是bmp文件,則返回"NULL"。
 *
 *************************************************************************
 */
CString GetFileName(CString strFilePathName, int nCurFrameNum)
{
	//文件的路徑名
	CString strTempFileName;

	int nNumPos=strFilePathName.Find(".");
	if(nNumPos==-1){
		AfxMessageBox("Please choose a bmp file");
		return "NULL";
	}

	//表示去掉了擴展名和數字標號的路徑名,在這里,限定幀數為0~999,所以采用三位來表示
	CString strFileNameNoExtNoNum=strFilePathName.Left(nNumPos-3);

	//表示標號的字符串
	CString strTempNum;

	if(nCurFrameNum<10){
		strTempNum.Format("00%d",nCurFrameNum);
	}
	else {
		if(nCurFrameNum<100 &&nCurFrameNum>=10){
			strTempNum.Format("0%d",nCurFrameNum);
		}
		else{
			strTempNum.Format("%d",nCurFrameNum);
		}
	}
	
	// 得到圖象文件名
	strTempFileName=strFileNameNoExtNoNum+strTempNum+".bmp";
	
	// 返回
	return strTempFileName;
}

/*************************************************************************
 *
 * \函數名稱:
 *   LoadDibSeq()
 *
 * \輸入參數:
 *   CString		strFilePath		- 第一幀圖象的文件名 
 *   int		nCurFrameNum		- 當前幀的圖象文件名
 *   int		nTotalFrameNum		- 進行檢測的圖象幀數
 *   CDib*		pDib			- 指向返回CDib類的指針
 *
 * \返回值:
 *   BOOL			- 成功則返回TRUE,否則返回FALSE
 *
 * \說明:
 *   該函數根據指定文件路徑名和當前圖象序列的幀數讀取圖象數據道pDib中
 *   該函數中需要注意的是,只能讀取0-999幀圖象,圖象為bmp格式,且按照
 *   幀數數字進行存儲,例如第一幀圖象文件名為×××001.bmp,第33幀圖象
 *   的文件名為×××033.bmp。
 *
 *************************************************************************
 */
BOOL LoadDibSeq(CString strFilePath, int nCurFrameNum, int nTotalFrameNum, CDib* pDib)
{
	//一般來講,程序在處理的過程中需要裝載的幀號應該是由外界指定的
	//當指定的幀號不合法時,就裝載當前幀作為默認值
	if (nCurFrameNum<1 || nCurFrameNum>nTotalFrameNum)
	{
		AfxMessageBox("Invalidate file frame number");
		return FALSE;
	}

	// 獲得當前幀的圖象文件名
	CString strTempFileName;
	strTempFileName=GetFileName(strFilePath,nCurFrameNum);
	
	CFile fileOpen=NULL;

	// 打開文件并讀取
	fileOpen.Open(strTempFileName,CFile::modeRead);
	if(pDib->Read(&fileOpen)==FALSE){
		AfxMessageBox("can not open the file "+strTempFileName);
		return FALSE;
	}
	return TRUE;
}


/*************************************************************************
 *
 * \函數名稱:
 *   BinaFrameDiff()
 *
 * \輸入參數:
 *   unsigned char*	pUnchImg1		- 圖象的文件名 
 *   unsigned char*	pUnchImg2		- 當前幀的圖象文件名
 *   int		nWidth
 *   int		nHeight
 *   unsigned char*	pUnchResult
 *   int		nThreshold
 *
 * \返回值:
 *   CString			- 返回給定幀數的圖象文件名
 *
 * \說明:
 *   該函數比較pUnchImg1和pUnchImg2兩個區域中的內容,如果兩個區域內     
 *容的差值的絕對值比Threshold大,則將pUnchResult相應的元素設置為邏輯值1,
 *用灰度255表示,否則為0,并用灰度0表示
 *
 *************************************************************************
 */
void BinaFrameDiff(unsigned char *pUnchImg1, unsigned char *pUnchImg2, 
		  int nWidth, int nHeight, unsigned char * pUnchResult,
		  int nThreshold)
{
	int nTemp=0;
	for (int i=0;i<nHeight*nWidth;i++) {
			nTemp = abs(pUnchImg1[i] - pUnchImg2[i]);			
			pUnchResult[i] = nTemp > nThreshold ? 255:0;
	} 
	return ;
}

/*************************************************************************
 *
 * \函數名稱:
 *   ErodeFrameDiff()
 *
 * \輸入參數:
 *   unsigned char*	pUnchImg1		- 圖象數據指針
 *   int		nWidth			- 圖象寬度
 *   int		nHeight			- 圖象高度
 *   int		nErodeHalfWin		- 腐蝕窗口大小的一半
 *   unsigned char*	pUnchResult		- 結果數據制止
 *   int		nThreshold		- 閾值
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數進行腐蝕操作,形態學操作對pUnchImg中的每一點,計算這一點對應的
 *窗口內的一些參數,然后根據參數結果給這個點設置相應的值. 功能上相當于廣義濾波	
 *
 *************************************************************************
 */
void ErodeFrameDiff(unsigned char *pUnchImg, int nWidth, int nHeight, int nErodeHalfWin, 
	  int nErodeThreshold, unsigned char *pUnchResult)
{
	// 搜索整個圖象,對圖象進行腐蝕處理
	for (int i=nErodeHalfWin;i<nHeight-nErodeHalfWin;i++) {
		for (int j=nErodeHalfWin;j<nWidth-nErodeHalfWin;j++) {
			// 如果幀間的差不為0才進行處理
			if (pUnchImg[i*nWidth+j] != 0) 
			{
				int iPointCount = 0;

				// 根據此點的鄰域判斷此點是否需要刪除
				for (int r=-nErodeHalfWin;r<=nErodeHalfWin;r++) {
					for (int c=-nErodeHalfWin;c<=nErodeHalfWin;c++) {
						if (pUnchImg[(i+r)*nWidth+j+c] != 0) {
							iPointCount++;
						}
					}
				}

				// 如果鄰域中不為0的個數小于設定的閾值,則強行設置為0
				if (iPointCount < nErodeThreshold) {
					pUnchResult[i*nWidth+j] = 0;
				}
				else {
					pUnchResult[i*nWidth+j] = 255;
				}
			}
			else 
			{
				pUnchResult[i*nWidth+j] = 0;
			}
		}
	}
	return ;
}

/*************************************************************************
 *
 * \函數名稱:
 *   GetBackground()
 *
 * \輸入參數:
 *   CString		strFilePath		- 第一幀圖象的文件名 
 *   int		nTotalFrameNum		- 進行檢測的圖象幀數
 *   int		nImageWidth		- 圖象寬度
 *   int		nImageHeight		- 圖象高度
 *   unsigned char *	pUnchBackGround		- 指向返回背景數據的指針
 *
 * \返回值:
 *   BOOL			- 成功則返回TRUE,否則返回FALSE
 *
 * \說明:
 *   該函數根據指定文件名的圖象序列求取靜止背景
 *
 *************************************************************************
 */
BOOL GetBackground(CString strFilePath, int nTotalFrameNum, int nImageWidth, 
		   int nImageHeight, unsigned char* pUnchBackGround)
{
	// 如果此時背景已經生成,函數返回,不需要再一次計算
	/*if (pUnchBackGround!=NULL){		
		return TRUE;
	}*/

	
	// pUnchTemp1和pUnchTemp2用來計算相鄰兩幀之間的幀差
	// 每次只要讀入一幀即可,即:假設剛剛比較k-1和k幀,那么現在比較k和
	// k+1幀,那么k幀是不需要重新讀入的
	unsigned char* pUnchTemp1;
	unsigned char* pUnchTemp2;

	pUnchTemp1 = new unsigned char[nImageWidth * nImageHeight * sizeof(unsigned char)];
	pUnchTemp2 = new unsigned char[nImageWidth * nImageHeight * sizeof(unsigned char)];
	
	// 臨時存放圖象數據的CDib指針
	CDib* pDibTemp;
	pDibTemp = new CDib;

	// 讀出第一幀數據并放入pDibTemp
	pDibTemp->Empty();
	if(!LoadDibSeq(strFilePath,1,nTotalFrameNum,pDibTemp)){
		return FALSE;
	}

	// 然后將數據取出,存放在pUnchTemp1中
	memcpy(pUnchTemp2,pDibTemp->m_lpImage,nImageWidth*nImageHeight*sizeof(unsigned char));	

	// pChResultAfterMor 是用來記錄幀間變化的內存區域
	unsigned char * pUnchTrackBox = new unsigned char[(nTotalFrameNum)*
		nImageWidth*nImageHeight*sizeof(unsigned char)];

	unsigned int index = 0;

	// 幀間差的區域,二進制
	unsigned char *pUnchTemp3=new unsigned char[nImageWidth*nImageHeight*sizeof(unsigned char)];

	// 腐蝕之后的區域,二進制
	unsigned char * pUnchResultAfterMor = new unsigned char[nImageWidth*nImageHeight*sizeof(unsigned char)];

	// 對每一幀進行比較
	for (int i = 2; i<nTotalFrameNum-1; i++)	{	
		// 打開第i幀圖象文件,并將圖象存放在CDib對象pDibTemp中
		pDibTemp->Empty();
		if(!LoadDibSeq(strFilePath , i , nTotalFrameNum , pDibTemp)){
			return FALSE;
		}

		// 然后將數據取出,存放在pUnchTemp2中
		memcpy(pUnchTemp2,pDibTemp->m_lpImage,nImageWidth*nImageHeight);	

		// 對圖象幀差進行二值化處理,并將二值化后的圖象存放在pUnchTemp3中
		BinaFrameDiff(pUnchTemp1,pUnchTemp2 ,nImageWidth,nImageHeight,pUnchTemp3,10);

		// 對二值化后的圖象進行腐蝕處理,在這里對腐蝕窗口的大小設置為2,閾值為7
		ErodeFrameDiff(pUnchTemp3,nImageWidth,nImageHeight,2,7,pUnchResultAfterMor);

		// 將此二值化后的程序放入pUnchTrackBox的相應位置		
		memcpy(pUnchTrackBox+index,pUnchResultAfterMor,sizeof(unsigned char)*nImageWidth*nImageHeight);

		// 計算圖象數據在pUnchTrackBox中的偏移量
		index = index + nImageWidth*nImageHeight*sizeof(unsigned char);
		
		// 每做完兩幀之間的比較,就使幀號下移一個,pUnchTemp1中是存k幀內容,pUnchTemp2幀是存k+1
		// 幀內容,所以,每次只要把pUnchTemp2中的內容給pTemp1,而pTemp2重新讀入既可以了.
		unsigned char* pUnchTag = NULL;

		pUnchTag   = pUnchTemp1;
		pUnchTemp1 = pUnchTemp2;
		pUnchTemp2 = pUnchTag;
	}
	
	// 釋放已分配內存
	delete []pUnchTemp1;	
	pUnchTemp1 = NULL;
	delete []pUnchTemp2;	
	pUnchTemp2 = NULL;	
	delete []pUnchTemp3;	
	pUnchTemp3 = NULL;
	delete []pUnchResultAfterMor;	
	pUnchResultAfterMor=NULL;
	
	// 每一幀的大小
	int nFrameSize = nImageWidth * nImageHeight * sizeof(unsigned char);
	
	// 記錄最大長度	
	int * pnTrackSegLen = new int [nImageWidth*nImageHeight];

	// 記錄最大長度中的中間幀標號
	int * pnTrackSegFrame = new int [nImageWidth*nImageHeight];

	// 對每一個象素點跟蹤最大為0的長度,并將最大長度中的中間幀標號記錄下來
	for (int y = 0; y<nImageHeight; y++)	{
		for (int x = 0; x<nImageWidth; x++)	{
			// 此象素在一幀那相對于該幀第一個元素的偏移量
			int offset = y * nImageWidth + x;

			// 初始化最大長度
			int largeLen = 0;
			int t = 1;

			// 連續為0的段的開始和結束幀標號
			int segStart,segEnd;

			// 跟蹤長度
			int segLen;

			// 當前幀數
			int frameNum;
			
			segLen = 0;
			frameNum = 1;

			// 遍歷整個序列,跟蹤并記錄此點連續為0的最大長度
			while (t < nTotalFrameNum - 1)	{
				// 如果還沒有到達序列結束并且此點的不為0,則繼續到下一幀搜索
				while ((t < nTotalFrameNum -1) && (pUnchTrackBox[t*nFrameSize+offset] != 0))	
					t++;

					//如果此時的t>= nTotalFrameNum - 1,則說明,已經遍歷到最后一幀了
					if (t >= nTotalFrameNum - 1)	
						break;

					// 此時應為此長度的開始
					segStart = t;

					while ((t < nTotalFrameNum - 1) && (pUnchTrackBox[t*nFrameSize+offset] == 0))	
						t++;						

					// 此長度的結束幀標號
					segEnd = t - 1;

					// 獲得此連續為0的幀的長度
					segLen = segEnd +1 -segStart;	

					// 判斷是否為最大長度,是則進行替換
					if (segLen > largeLen)	{
						largeLen = segLen;
						frameNum = (segEnd + segStart)/2;				
					}
				} 
				
				pnTrackSegLen[offset] = largeLen;
				pnTrackSegFrame[offset] = frameNum;
		}
	}

	delete []pUnchTrackBox;	pUnchTrackBox=NULL;
	
	// 因為對每個象素而言,背景可能出現在不同幀里,此時需要把所有幀調入內存
	unsigned char* pBuffer = new unsigned char[nTotalFrameNum*(nImageWidth*nImageHeight)];

	for (int k=1; k<nTotalFrameNum; k++)	{
		pDibTemp->Empty();
		LoadDibSeq(strFilePath , k , nTotalFrameNum , pDibTemp);

		// 然后將數據取出,存放在pBuffer的相應位置中
		memcpy(pBuffer+k*nFrameSize,pDibTemp->m_lpImage,nImageWidth*nImageHeight);	
	}

	// 遍歷整個圖象,設置背景數據
	for (y=0; y<nImageHeight; y++)	{
		for (int x=0; x<nImageWidth; x++)	{
			// 獲得此象素點在一幀數據中的偏移量
			int k = y * nImageWidth + x;	

			// 獲得此象素點連續為0的最大長度的中間幀標號
			int nFrameMax = pnTrackSegFrame [k];

			// 設置具有最大長度的中間幀的數據為背景數據
			pUnchBackGround[k] = pBuffer[(nFrameMax*nFrameSize)+k];
		}
	}		

	delete []pnTrackSegLen; 
	pnTrackSegLen=NULL;
	delete []pnTrackSegFrame;	
	pnTrackSegFrame=NULL;
	delete []pBuffer; 
	pBuffer=NULL;
	
	::SetCursor(::LoadCursor(NULL, IDC_ARROW));
	
	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国一区二区三区| 精品一区二区三区久久久| 奇米精品一区二区三区四区 | 亚洲精品在线免费播放| 亚洲美女淫视频| 成人性色生活片免费看爆迷你毛片| 91久久线看在观草草青青| 国产性做久久久久久| 青青草原综合久久大伊人精品 | 久久综合丝袜日本网| 视频在线在亚洲| 色一情一乱一乱一91av| 国产亚洲精品精华液| 久久国产尿小便嘘嘘| 91麻豆精品国产自产在线| 亚洲欧美视频一区| jiyouzz国产精品久久| 欧美高清在线视频| 成人美女视频在线观看| 久久久久国产免费免费| 国产曰批免费观看久久久| 日韩欧美久久一区| 久久不见久久见免费视频1| 日韩免费高清视频| 久久99久久99精品免视看婷婷| 91精品国产欧美日韩| 日韩激情av在线| 日韩一区二区在线播放| 免费精品视频在线| 精品国产一区二区三区av性色| 日韩av一区二区在线影视| 欧美久久一二三四区| 偷拍与自拍一区| 制服丝袜在线91| 青青青伊人色综合久久| 欧美va在线播放| 国产精品影视在线观看| 久久精品水蜜桃av综合天堂| 成人三级伦理片| 成人免费在线视频| 在线观看国产精品网站| 亚洲成人久久影院| 日韩欧美一级二级三级| 高清成人免费视频| 一区二区三区产品免费精品久久75| 91视频在线观看免费| 亚洲午夜私人影院| 欧美一区二区大片| 国产91丝袜在线观看| 中文字幕在线播放不卡一区| 91极品视觉盛宴| 日日夜夜一区二区| 国产午夜久久久久| 91传媒视频在线播放| 日本欧美韩国一区三区| 欧美精品一区二| 色狠狠综合天天综合综合| 日韩综合小视频| 国产日韩欧美亚洲| 在线免费观看视频一区| 麻豆成人91精品二区三区| 久久精品免费在线观看| 在线观看亚洲一区| 国产激情偷乱视频一区二区三区| 国产精品国产自产拍高清av | 国产精品剧情在线亚洲| 日本久久一区二区三区| 久久成人麻豆午夜电影| 亚洲欧洲av色图| 日韩精品一区二区三区蜜臀| 91在线国内视频| 久久国产剧场电影| 亚洲国产精品久久久男人的天堂| 精品对白一区国产伦| 日本道免费精品一区二区三区| 久久不见久久见免费视频1| 亚洲精品乱码久久久久久黑人 | 亚洲另类在线一区| 欧美r级电影在线观看| 91久久香蕉国产日韩欧美9色| 精品系列免费在线观看| 一区av在线播放| 国产欧美视频一区二区| 欧美老年两性高潮| 91亚洲国产成人精品一区二区三 | 6080午夜不卡| 91在线一区二区| 国产成人av一区二区| 日韩精品一二三区| 亚洲国产欧美另类丝袜| 中文字幕在线不卡视频| 国产三级一区二区| 日韩精品一区二区三区中文不卡| 欧洲精品视频在线观看| jizzjizzjizz欧美| 豆国产96在线|亚洲| 国产在线精品一区二区三区不卡| 天堂蜜桃一区二区三区 | 久久九九99视频| 欧美一级免费大片| 欧美日韩国产小视频| 在线视频一区二区三| 91影院在线免费观看| 成人av在线一区二区三区| 国产黄色精品网站| 国产高清在线精品| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲免费观看高清在线观看| 欧美经典三级视频一区二区三区| 欧美精品一区二区在线观看| 日韩亚洲欧美在线| 日韩欧美国产麻豆| 欧美成人精品高清在线播放| 91精品国产91综合久久蜜臀| 日韩一区二区三区观看| 欧美一二三区在线观看| 欧美不卡一区二区三区| 久久影院视频免费| 2020国产精品自拍| 中文字幕乱码一区二区免费| 国产精品每日更新| 亚洲日本va午夜在线影院| 亚洲区小说区图片区qvod| 亚洲欧美激情小说另类| 亚洲电影第三页| 蜜臀久久99精品久久久久宅男| 麻豆精品新av中文字幕| 国产精品99精品久久免费| 成人黄色在线看| 一本大道久久a久久精二百| 欧美性高清videossexo| 日韩一区二区三区视频在线观看| 欧美本精品男人aⅴ天堂| 欧美国产激情二区三区| 亚洲欧美日韩久久精品| 日产国产欧美视频一区精品| 狠狠色丁香九九婷婷综合五月| 国产乱码精品一品二品| 一本一本大道香蕉久在线精品 | 亚洲欧洲韩国日本视频| 图片区小说区国产精品视频| 国内久久精品视频| 91浏览器在线视频| 欧美一区二区大片| 亚洲欧美在线高清| 日韩av一区二区三区四区| 国产精品一区二区视频| 色8久久精品久久久久久蜜| 欧美草草影院在线视频| 一区二区三区四区亚洲| 久久国产精品第一页| 91高清视频免费看| 久久久国产精华| 日韩av一区二区三区四区| 不卡视频一二三四| 日韩精品专区在线影院观看| 日韩伦理av电影| 九色porny丨国产精品| 91成人网在线| 国产欧美精品在线观看| 日韩精品欧美成人高清一区二区| 国产成人综合网站| 91精品国产综合久久久蜜臀粉嫩| 国产精品三级电影| 精品一区二区免费在线观看| 在线看国产日韩| 国产精品国产三级国产普通话三级 | 亚洲美女视频一区| 精品亚洲成a人| 91精品欧美久久久久久动漫 | 国产拍揄自揄精品视频麻豆 | 午夜精品视频在线观看| 成人激情免费网站| 久久亚洲精品小早川怜子| 日韩精品电影在线观看| 一本一本大道香蕉久在线精品| 国产视频在线观看一区二区三区| 天天综合色天天综合色h| 99国产精品国产精品毛片| 国产亚洲自拍一区| 精品一区二区在线免费观看| 欧美日韩美少妇| 亚洲一区二区三区四区不卡| 99国产一区二区三精品乱码| 中文字幕精品一区| 国产精品白丝jk白祙喷水网站| 精品国免费一区二区三区| 奇米影视一区二区三区小说| 777亚洲妇女| 五月天久久比比资源色| 91成人网在线| 亚洲成av人综合在线观看| 在线看日本不卡| 亚洲图片自拍偷拍| 欧美亚洲一区三区| 一二三四区精品视频| 91精品福利在线| 亚洲成人久久影院| 91精品国产91久久久久久一区二区| 午夜视频久久久久久|