⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seqprocessdlg.cpp

📁 在人脸检测的基础之上,对嘴部的运动表情进行分析,进行语音模拟.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
						if(FirstCandidate==NULL)
						{
							FirstCandidate=new SeedCandidate;
							LastCandidate=FirstCandidate;
							FirstCandidate->nextCand=NULL;
							FirstCandidate->seed_cand.x=seed.x+m;
							FirstCandidate->seed_cand.y=seed.y+k;
							seedcand=FirstCandidate->seed_cand;

							rgbToHsv(imgPrev(seed.y,seed.x,0),imgPrev(seed.y,seed.x,1),imgPrev(seed.y,seed.x,2),seedhsi.Hue, seedhsi.Sat,seedhsi.Inten);
							rgbToHsv(imgNext(seedcand.y,seedcand.x,0),imgNext(seedcand.y,seedcand.x,1),imgNext(seedcand.y,seedcand.x,2),candhsi.Hue, candhsi.Sat,candhsi.Inten);
							FirstCandidate->HueError=abs(seedhsi.Hue-candhsi.Hue);
								
							rgbToHsv(imgPrev(seed.y+3,seed.x,0),imgPrev(seed.y+3,seed.x,1),imgPrev(seed.y+3,seed.x,2),seedhsiDown.Hue,seedhsiDown.Sat,seedhsiDown.Inten);
							rgbToHsv(imgNext(seedcand.y+3,seedcand.x,0),imgNext(seedcand.y+3,seedcand.x,1),imgNext(seedcand.y+3,seedcand.x,2),candhsiDown.Hue, candhsiDown.Sat,candhsiDown.Inten);
							FirstCandidate->HueError+=abs(seedhsiDown.Hue-candhsiDown.Hue);
								
							if(seedcand.y-3>0)
							{
								rgbToHsv(imgPrev(seed.y-3,seed.x,0),imgPrev(seed.y-3,seed.x,1),imgPrev(seed.y-3,seed.x,2),seedhsiUp.Hue,seedhsiUp.Sat,seedhsiUp.Inten);
								rgbToHsv(imgNext(seedcand.y-3,seedcand.x,0),imgNext(seedcand.y-3,seedcand.x,1),imgNext(seedcand.y-3,seedcand.x,2),candhsiUp.Hue,candhsiUp.Sat,candhsiUp.Inten);
								FirstCandidate->HueError+=abs(seedhsiUp.Hue-candhsiUp.Hue);
								FirstCandidate->HueError/=3;
							}
							else FirstCandidate->HueError/=2;

								//FirstCandidate->GradMagError=abs(GradientMagnitude[frame](seedcand.y,seedcand.x)-GradientMagnitude[m_startframe](seed.y,seed.x));
								//FirstCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y+3,seedcand.x)-GradientMagnitude[m_startframe](seed.y+3,seed.x));
							FirstCandidate->GradMagError=GradientMagnitude[frame](seedcand.y,seedcand.x);
								/*FirstCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y+3,seedcand.x);

								if(seedcand.y-3>0) 
								{
									//FirstCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y-3,seedcand.x)-GradientMagnitude[m_startframe](seed.y-3,seed.x));
									FirstCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y-3,seedcand.x);
									FirstCandidate->GradMagError/=3;
								}
								else FirstCandidate->GradMagError/=2;*/
							
							Numcandidate=1;
						}

						else
						{
							NewCandidate=new SeedCandidate;
							NewCandidate->nextCand=NULL;
							NewCandidate->seed_cand.x=seed.x+m;
							NewCandidate->seed_cand.y=seed.y+k;
							seedcand=NewCandidate->seed_cand;
							LastCandidate->nextCand=NewCandidate;
							LastCandidate=NewCandidate;

							rgbToHsv(imgPrev(seed.y,seed.x,0),imgPrev(seed.y,seed.x,1),imgPrev(seed.y,seed.x,2),seedhsi.Hue, seedhsi.Sat,seedhsi.Inten);
							rgbToHsv(imgNext(seedcand.y,seedcand.x,0),imgNext(seedcand.y,seedcand.x,1),imgNext(seedcand.y,seedcand.x,2),candhsi.Hue, candhsi.Sat,candhsi.Inten);
							NewCandidate->HueError=abs(seedhsi.Hue-candhsi.Hue);
								
							rgbToHsv(imgPrev(seed.y+3,seed.x,0),imgPrev(seed.y+3,seed.x,1),imgPrev(seed.y+3,seed.x,2),seedhsiDown.Hue,seedhsiDown.Sat,seedhsiDown.Inten);
							rgbToHsv(imgNext(seedcand.y+3,seedcand.x,0),imgNext(seedcand.y+3,seedcand.x,1),imgNext(seedcand.y+3,seedcand.x,2),candhsiDown.Hue, candhsiDown.Sat,candhsiDown.Inten);
							NewCandidate->HueError+=abs(seedhsiDown.Hue-candhsiDown.Hue);
								
							if(seedcand.y-3>0)
							{
								rgbToHsv(imgPrev(seed.y-3,seed.x,0),imgPrev(seed.y-3,seed.x,1),imgPrev(seed.y-3,seed.x,2),seedhsiUp.Hue,seedhsiUp.Sat,seedhsiUp.Inten);
								rgbToHsv(imgNext(seedcand.y-3,seedcand.x,0),imgNext(seedcand.y-3,seedcand.x,1),imgNext(seedcand.y-3,seedcand.x,2),candhsiUp.Hue,candhsiUp.Sat,candhsiUp.Inten);
								NewCandidate->HueError+=abs(seedhsiUp.Hue-candhsiUp.Hue);
								NewCandidate->HueError/=3;
							}
							else NewCandidate->HueError/=2;

								//NewCandidate->GradMagError=abs(GradientMagnitude[frame](seedcand.y,seedcand.x)-GradientMagnitude[m_startframe](seed.y,seed.x));
								//NewCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y+3,seedcand.x)-GradientMagnitude[m_startframe](seed.y+3,seed.x));
							NewCandidate->GradMagError=GradientMagnitude[frame](seedcand.y,seedcand.x);
								/*NewCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y+3,seedcand.x);
								
								if(seedcand.y-3>0) 
								{
									//NewCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y-3,seedcand.x)-GradientMagnitude[m_startframe](seed.y-3,seed.x));
									NewCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y-3,seedcand.x);
									NewCandidate->GradMagError/=3;
								}
								else NewCandidate->GradMagError/=2;*/
								
							Numcandidate++;							
						}
						
					}

					else
					{
						distance=pow(seed.y-seed_array[index-1].y,2)+pow(seed.x-seed_array[index-1].x,2);
						distance=pow(distance,0.5);
						if((seed.x-seed_array[index-1].x)!=0) angle=atan((seed.y-seed_array[index-1].y)/(seed.x-seed_array[index-1].x));
						else angle=1.5708;

						if(FirstCandidate==NULL)
						{
							FirstCandidate=new SeedCandidate;
							LastCandidate=FirstCandidate;
							FirstCandidate->nextCand=NULL;
							FirstCandidate->seed_cand.x=seed.x+m;
							FirstCandidate->seed_cand.y=seed.y+k;
							seedcand=FirstCandidate->seed_cand;

							CandDistance=pow(seedcand.y-next_seed_array[index-1].y,2)+pow(seedcand.x-next_seed_array[index-1].x,2);
							CandDistance=pow(CandDistance,0.5);
							if((seedcand.x-next_seed_array[index-1].x)!=0) CandAngle=atan((seedcand.y-next_seed_array[index-1].y)/(seedcand.x-next_seed_array[index-1].x));
							else CandAngle=1.5708;
							
							FirstCandidate->PositionError=abs(distance-CandDistance)*100/distance;
							FirstCandidate->PositionError+=abs(angle-CandAngle)*100/angle;

							rgbToHsv(imgPrev(seed.y,seed.x,0),imgPrev(seed.y,seed.x,1),imgPrev(seed.y,seed.x,2),seedhsi.Hue, seedhsi.Sat,seedhsi.Inten);
							rgbToHsv(imgNext(seedcand.y,seedcand.x,0),imgNext(seedcand.y,seedcand.x,1),imgNext(seedcand.y,seedcand.x,2),candhsi.Hue, candhsi.Sat,candhsi.Inten);
							FirstCandidate->HueError=abs(seedhsi.Hue-candhsi.Hue);
									
								
							rgbToHsv(imgPrev(seed.y+3,seed.x,0),imgPrev(seed.y+3,seed.x,1),imgPrev(seed.y+3,seed.x,2),seedhsiDown.Hue,seedhsiDown.Sat,seedhsiDown.Inten);
							rgbToHsv(imgNext(seedcand.y+3,seedcand.x,0),imgNext(seedcand.y+3,seedcand.x,1),imgNext(seedcand.y+3,seedcand.x,2),candhsiDown.Hue, candhsiDown.Sat,candhsiDown.Inten);
							FirstCandidate->HueError+=abs(seedhsiDown.Hue-candhsiDown.Hue);
									
							if(seedcand.y-3>0)
							{
								rgbToHsv(imgPrev(seed.y-3,seed.x,0),imgPrev(seed.y-3,seed.x,1),imgPrev(seed.y-3,seed.x,2),seedhsiUp.Hue,seedhsiUp.Sat,seedhsiUp.Inten);
								rgbToHsv(imgNext(seedcand.y-3,seedcand.x,0),imgNext(seedcand.y-3,seedcand.x,1),imgNext(seedcand.y-3,seedcand.x,2),candhsiUp.Hue,candhsiUp.Sat,candhsiUp.Inten);
								FirstCandidate->HueError+=abs(seedhsiUp.Hue-candhsiUp.Hue);
								FirstCandidate->HueError/=3;
							}
						
							else FirstCandidate->HueError/=2;

									//FirstCandidate->GradMagError=abs(GradientMagnitude[frame](seedcand.y,seedcand.x)-GradientMagnitude[m_startframe](seed.y,seed.x));
									//FirstCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y+3,seedcand.x)-GradientMagnitude[m_startframe](seed.y+3,seed.x));
							FirstCandidate->GradMagError=GradientMagnitude[frame](seedcand.y,seedcand.x);
									/*FirstCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y+3,seedcand.x);
									if(seedcand.y-3>0) 
									{
										//FirstCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y-3,seedcand.x)-GradientMagnitude[m_startframe](seed.y-3,seed.x));
										FirstCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y-3,seedcand.x);
										FirstCandidate->GradMagError/=3;
									}
									else FirstCandidate->GradMagError/=2;*/
									
							Numcandidate=1;
						}

						else
						{
							NewCandidate=new SeedCandidate;
							NewCandidate->nextCand=NULL;
							NewCandidate->seed_cand.x=seed.x+m;
							NewCandidate->seed_cand.y=seed.y+k;
							seedcand=NewCandidate->seed_cand;
							LastCandidate->nextCand=NewCandidate;
							LastCandidate=NewCandidate;

							CandDistance=pow(seedcand.y-next_seed_array[index-1].y,2)+pow(seedcand.x-next_seed_array[index-1].x,2);
							CandDistance=pow(CandDistance,0.5);
							if((seedcand.x-next_seed_array[index-1].x)!=0) CandAngle=atan((seedcand.y-next_seed_array[index-1].y)/(seedcand.x-next_seed_array[index-1].x));
							else CandAngle=1.5708;
							
							NewCandidate->PositionError=abs(distance-CandDistance)*100/distance;
							NewCandidate->PositionError+=abs(angle-CandAngle)*100/angle;

							rgbToHsv(imgPrev(seed.y,seed.x,0),imgPrev(seed.y,seed.x,1),imgPrev(seed.y,seed.x,2),seedhsi.Hue, seedhsi.Sat,seedhsi.Inten);
							rgbToHsv(imgNext(seedcand.y,seedcand.x,0),imgNext(seedcand.y,seedcand.x,1),imgNext(seedcand.y,seedcand.x,2),candhsi.Hue, candhsi.Sat,candhsi.Inten);
							NewCandidate->HueError=abs(seedhsi.Hue-candhsi.Hue);
									
							rgbToHsv(imgPrev(seed.y+3,seed.x,0),imgPrev(seed.y+3,seed.x,1),imgPrev(seed.y+3,seed.x,2),seedhsiDown.Hue,seedhsiDown.Sat,seedhsiDown.Inten);
							rgbToHsv(imgNext(seedcand.y+3,seedcand.x,0),imgNext(seedcand.y+3,seedcand.x,1),imgNext(seedcand.y+3,seedcand.x,2),candhsiDown.Hue, candhsiDown.Sat,candhsiDown.Inten);
							NewCandidate->HueError+=abs(seedhsiDown.Hue-candhsiDown.Hue);
									
							if(seedcand.y-3>0)
							{
								rgbToHsv(imgPrev(seed.y-3,seed.x,0),imgPrev(seed.y-3,seed.x,1),imgPrev(seed.y-3,seed.x,2),seedhsiUp.Hue,seedhsiUp.Sat,seedhsiUp.Inten);
								rgbToHsv(imgNext(seedcand.y-3,seedcand.x,0),imgNext(seedcand.y-3,seedcand.x,1),imgNext(seedcand.y-3,seedcand.x,2),candhsiUp.Hue,candhsiUp.Sat,candhsiUp.Inten);
								NewCandidate->HueError+=abs(seedhsiUp.Hue-candhsiUp.Hue);
								NewCandidate->HueError/=3;
							}
							
							else NewCandidate->HueError/=2;

									//NewCandidate->GradMagError=abs(GradientMagnitude[frame](seedcand.y,seedcand.x)-GradientMagnitude[m_startframe](seed.y,seed.x));
									//NewCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y+3,seedcand.x)-GradientMagnitude[m_startframe](seed.y+3,seed.x));
							NewCandidate->GradMagError=GradientMagnitude[frame](seedcand.y,seedcand.x);
									/*NewCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y+3,seedcand.x);
									if(seedcand.y-3>0) 
									{
										//NewCandidate->GradMagError+=abs(GradientMagnitude[frame](seedcand.y-3,seedcand.x)-GradientMagnitude[m_startframe](seed.y-3,seed.x));
										NewCandidate->GradMagError+=GradientMagnitude[frame](seedcand.y-3,seedcand.x);
										NewCandidate->GradMagError/=3;
									}
									else NewCandidate->GradMagError/=2;*/
									
							Numcandidate++;							
						}

					}
				}	

			
				
			NewCandidate=new SeedCandidate;
				
			//GRADIENT MAGNITUDE CRITERION
				
			for(i=1; i<=Numcandidate; i++)
			{
				Test1=FirstCandidate;
				Test2=FirstCandidate->nextCand;

				while(Test1->nextCand!=NULL)
				{
					if(Test1->GradMagError <(Test2->GradMagError))
					{
						NewCandidate->seed_cand=Test2->seed_cand;
						NewCandidate->HueError= Test2->HueError;
						NewCandidate->GradMagError=Test2->GradMagError;
						NewCandidate->PositionError=Test2->PositionError;

					    Test2->seed_cand = Test1->seed_cand;
						Test2->HueError =Test1->HueError;
						Test2->GradMagError =Test1->GradMagError;
						Test2->PositionError =Test1->PositionError;
						
						Test1->seed_cand=NewCandidate->seed_cand;
						Test1->HueError=NewCandidate->HueError;
						Test1->GradMagError=NewCandidate->GradMagError;
						Test1->PositionError=NewCandidate->PositionError;
					}
					Test2=Test2->nextCand;
					Test1=Test1->nextCand;
				}
			}

			//PositionError CRITERION		
				
				
			if(Numcandidate>40) N=20;
			else if(Numcandidate>=20) N=15;
			else if(Numcandidate>=10) N=8;
			else if(Numcandidate>=5) N=4;
			else N=0;

			for(i=1; i<=N; i++)
			{
				Test1=FirstCandidate;
				Test2=FirstCandidate->nextCand;
				count = 0;

				while(count<N-1)
				{
					if(Test1->PositionError > (Test2->PositionError))
					{
						NewCandidate->seed_cand=Test2->seed_cand;
						NewCandidate->HueError= Test2->HueError;
						NewCandidate->GradMagError=Test2->GradMagError;
						NewCandidate->PositionError= Test2->PositionError;

					    Test2->seed_cand = Test1->seed_cand;
						Test2->HueError =Test1->HueError;
						Test2->GradMagError =Test1->GradMagError;
						Test2->PositionError =Test1->PositionError;
						
						Test1->seed_cand=NewCandidate->seed_cand;
						Test1->HueError=NewCandidate->HueError;
						Test1->GradMagError=NewCandidate->GradMagError;
						Test1->PositionError=NewCandidate->PositionError;
					}
					Test2=Test2->nextCand;
					Test1=Test1->nextCand;
					count++;
				}
					
			}





			//HUE MATCHING CRITERION		
			if(Numcandidate>40) N=10;
			else if(Numcandidate>=20) N=7;
			else if(Numcandidate>=10) N=4;
			else if(Numcandidate>=5) N=2;
			else N=0;

			for(i=1; i<=N; i++)
			{
				Test1=FirstCandidate;
				Test2=FirstCandidate->nextCand;
				count = 0;

				while(count<N-1)
				{
					if(Test1->HueError > (Test2->HueError))
					{
						NewCandidate->seed_cand=Test2->seed_cand;
						NewCandidate->HueError= Test2->HueError;
						NewCandidate->GradMagError=Test2->GradMagError;

					    Test2->seed_cand = Test1->seed_cand;
						Test2->HueError =Test1->HueError;
						Test2->GradMagError =Test1->GradMagError;
							
						Test1->seed_cand=NewCandidate->seed_cand;
						Test1->HueError=NewCandidate->HueError;
						Test1->GradMagError=NewCandidate->GradMagError;
					}
					Test2=Test2->nextCand;
					Test1=Test1->nextCand;
					count++;
				}
					
			}
			

			upsearch=0;
			downsearch=0;
			count=0;
			i=1;
			if(index<=8)
			{
				if(FirstCandidate->seed_cand.y>15) upsearch=12;
				else if(FirstCandidate->seed_cand.y>10) upsearch=7;
				else if(FirstCandidate->seed_cand.y>5) upsearch=3;
				else upsearch=0;
				while(i<=upsearch)
				{
					if(abs(GradientMagnitude[fr+1](FirstCandidate->seed_cand.y-i,FirstCandidate->seed_cand.x)-GradMagUpAve)<=GradMagUpStdDev/3) count++;
					i++;
				}
				
				testseed=FirstCandidate->seed_cand;
			
				if(count>=3)
				{
				
					for(i = 1; i<=upsearch;i++)
						if(abs(GradientMagnitude[fr+1](testseed.y-i,testseed.x)- GradMagUpAve)<=GradMagUpStdDev/3)
						{
							/*rgbToHsv(imgPrev(seed.y,seed.x,0),imgPrev(seed.y,seed.x,1),imgPrev(seed.y,seed.x,2),hsi_prev.Hue, hsi_prev.Sat, hsi_prev.Inten);
							rgbToHsv(imgNext(testseed.y-i,testseed.x,0),imgNext(testseed.y-i,testseed.x,1),imgNext(testseed.y-i,testseed.x,2),hsi_next.Hue, hsi_next.Sat, hsi_next.Inten);
							inouterror2=abs(hsi_prev.Hue-hsi_next.Hue);
							
							rgbToHsv(imgPrev(seed.y+3,seed.x,0),imgPrev(seed.y+3,seed.x,1),imgPrev(seed.y+3,seed.x,2),hsi_prev.Hue, hsi_prev.Sat, hsi_prev.Inten);
							rgbToHsv(imgNext(testseed.y+3-i,testseed.x,0),imgNext(testseed.y+3-i,testseed.x,1),imgNext(testseed.y+3-i,testseed.x,2),hsi_next.Hue, hsi_next.Sat, hsi_next.Inten);
							inouterror2+=abs(hsi_prev.Hue-hsi_next.Hue);

							rgbToHsv(imgPrev(seed.y-3,seed.x,0),imgPrev(seed.y-3,seed.x,1),imgPrev(seed.y-3,seed.x,2),hsi_prev.Hue, hsi_prev.Sat, hsi_prev.Inten);
							rgbToHsv(imgNext(testseed.y-3-i,testseed.x,0),imgNext(testseed.y-3-i,testseed.x,1),imgNext(testseed.y-3-i,testseed.x,2),hsi_next.Hue, hsi_next.Sat, hsi_next.Inten);
							inouterror2+=abs(hsi_prev.Hue-hsi_next.Hue);
							*/
							inouterror2=GradientMagnitude[fr+1](testseed.y-i,testseed.x);
							if(i==1)
							{
								inouterror=inouterror2;
								FirstCandidate->seed_cand.y = FirstCandidate->seed_cand.y-1;
							}
							else if(inouterror2>inouterror) //b鼀黭 gradyanl

⌨️ 快捷键说明

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