标签:
核心代码:
1 private void Process() 2 { 3 IplImage imgShow = new IplImage(new CvSize(mCvCapture.FrameWidth / 2, mCvCapture.FrameHeight / 2), BitDepth.U8, 3); 4 5 IplImage iplImgSrc = mCvCapture.QueryFrame(); 6 if (iplImgSrc == null) 7 { 8 Debug.WriteLine("CvCapture QueryFrame 取像为空。"); 9 return; 10 } 11 12 //反转 13 Cv.Flip(iplImgSrc, iplImgSrc, FlipMode.Y); 14 15 //缩小图片 16 IplImage iplImgSrc2 = new IplImage(new CvSize(iplImgSrc.Width / 2, iplImgSrc.Height / 2), iplImgSrc.Depth, 3); 17 iplImgSrc.Resize(iplImgSrc2); 18 iplImgSrc = iplImgSrc2; 19 20 iplImgSrc.Copy(imgShow); 21 22 //图像预处理 23 IplImage imgGray = new IplImage(iplImgSrc.GetSize(), BitDepth.U8, 1); 24 iplImgSrc.CvtColor(imgGray, ColorConversion.RgbaToGray); 25 //Cv.ReleaseImage(iplImgSrc); 26 27 //imgGray.Smooth(imgGray, SmoothType.Gaussian, 5); 28 //imgGray.Threshold(imgGray, 128, 255, ThresholdType.Binary); 29 //Cv.Threshold(imgGray, imgGray, 100, 255, ThresholdType.Binary); 30 31 iplImgSrc = imgGray; 32 //---------------------------------------------------------------------- 33 34 #region 定位跟踪 35 36 mWagSearchFlow.mInputImage = iplImgSrc; 37 mWagSearchFlow.Run(); 38 39 #endregion 40 41 //---------------------------------------------------------------------- 42 43 CvPoint cvPointFocusCenter = new CvPoint((int)mWagSearchFlow.mResultPoint[0].X, 44 (int)mWagSearchFlow.mResultPoint[0].Y); 45 46 //Cv.DrawCircle(imgShow, cvPointFocusCenter, 4, CvColor.Red); 47 48 CvPoint2D32f calcMousePos = this.mPointImageToScreen.CalculateZoomPos(cvPointFocusCenter, this.mPointImageToScreen.mPointMouseSet); 49 this.mPointImageToScreen.mPointMouseSet = calcMousePos; 50 51 52 if (this.mPointImageToScreen.mbEnabledControlCursor) 53 { 54 WagPointImageToScreen.SetCursorPos((int)calcMousePos.X, (int)calcMousePos.Y);//控制鼠标位置 55 56 } 57 58 59 //|| mWagSearchFlow.Lost 60 //wagDisplayPoint1.SetPaintHandler(WagPaintHandlerType.CenterSelect); 61 62 bool bStop = this.mPointImageToScreen.CheckMoveStop(); 63 if (bStop) 64 { 65 this.mPointImageToScreen.mbEnabledControlCursor = false; 66 mlFreeTimeStart = Environment.TickCount; 67 } 68 69 if (this.mbAutoControl) 70 { 71 if (!this.mPointImageToScreen.mbEnabledControlCursor) 72 { 73 long nDiff = Environment.TickCount - mlFreeTimeStart; 74 if (nDiff > mlFreeTimeMax) 75 { 76 this.mPointImageToScreen.mbEnabledControlCursor = true; 77 } 78 } 79 } 80 81 this.Invoke(new Action( 82 delegate 83 { 84 this.wagDisplayPoint1.UpdateImage(imgShow.ToBitmap()); 85 })); 86 87 wagDisplayPoint1.SetPaintPoint((int)mWagSearchFlow.mResultPoint[0].X, (int)mWagSearchFlow.mResultPoint[0].Y); 88 89 Cv.ReleaseImage(imgShow); 90 91 //Cv.ReleaseImage(iplImgSrc); 92 //Cv.ReleaseImage(null); 93 94 Thread.Sleep(5); 95 }
public void Run() { mInputImage.Copy(m_CvArr_Curr); if (m_CvArr_Prev == null) { throw new ArgumentNullException("m_CvArr_Prev"); } if (m_CvArr_Curr == null) { throw new ArgumentNullException("m_CvArr_Curr"); } if (m_CvPoint_PrevFeatures == null) { throw new ArgumentNullException("m_CvPoint_PrevFeatures"); } //CvWindow win = new CvWindow(imgGray); //win.ShowImage(imgGray); //System.Windows.Forms.Application.DoEvents(); //Thread.Sleep(1000000); //交换坐标 this.SwapPoints(ref this.m_CvPoint_CurrFeatures[0], ref this.m_CvPoint_PrevFeatures[0]); //执行 try { Cv.CalcOpticalFlowPyrLK( m_CvArr_Prev, //(01) 在时间 t 的第一帧。First frame, at time t. m_CvArr_Curr, //(02) 在时间 t + dt 的第二个帧。Second frame, at time t + dt. m_CvArr_PrevPyr, //(03) 金字塔的第一帧缓冲。Buffer for the pyramid for the first frame. If the pointer is not null , the buffer must have a sufficient size to store the pyramid from level 1 to level #level ; the total size of (image_width+8)*image_height/3 bytes is sufficient. m_CvArr_CurrPyr, //(04) 类似于 prevPyr,用于第二个帧。Similar to prev_pyr, used for the second frame. m_CvPoint_PrevFeatures, //(05) 流量需要被发现的点数组。Array of points for which the flow needs to be found. out m_CvPoint_CurrFeatures, //(06) 二维数组指向包含计算新职位的输入特征中第二个图像。Array of 2D points containing calculated new positions of input features in the second image. _sizeWin, //(07) 每个金字塔级别搜索窗口的大小。Size of the search window of each pyramid level. _nlevel, //(08) 最大的金字塔级别编号。如果为 0,则不使用金字塔 (单水平),如果为 1,两个级别使用,等等。Maximal pyramid level number. If 0 , pyramids are not used (single level), if 1 , two levels are used, etc. out status, //(09) Array. Every element of the array is set to 1 if the flow for the corresponding feature has been found, 0 otherwise. out trackError, //(10) Array of double numbers containing difference between patches around the original and moved points. Optional parameter; can be NULL . criteria, //(11) 指定何时应停止流动寻找每个点上每个金字塔级别的迭代过程。Specifies when the iteration process of finding the flow for each point on each pyramid level should be stopped. flags //(12) 混杂。Miscellaneous flags. ); } catch (Exception ex) { string sErr = "CalcOpticalFlowPyrLK : --> " + ex.Message; Debug.WriteLine(sErr); } Debug.WriteLine("追踪状态: --> " + status[0].ToString()); if (!mbLost && status[0] == 0) { bool bLost = false; bLost = true; if (bLost) { mbLost = true; Debug.WriteLine("失去焦点: ---> " + DateTime.Now.ToString("yyyyMMdd_HHmmss_ffff")); return; } } this.Limit(ref this.m_CvPoint_CurrFeatures[0], this.m_CvPoint_PrevFeatures[0]); CvPoint2D32f p = new CvPoint2D32f(this.m_CvPoint_CurrFeatures[0].X, this.m_CvPoint_CurrFeatures[0].Y); this.mResultPoint[0] = p; this.SwapImages(ref m_CvArr_Curr, ref m_CvArr_Prev); this.SwapImages(ref m_CvArr_CurrPyr, ref m_CvArr_PrevPyr); }
有兴趣的朋友可联系以获得源码。
标签:
原文地址:http://www.cnblogs.com/wagwei/p/4214232.html