标签:
这段时间在做一个基于emgu的行人统计项目,笔者在框定区域时,发现老是出现问题。然后笔者写了一个小程序测试,发现了问题出在图像矩阵扫描这一块
在pictureBox上鼠标的坐标是
而emgu的是从y方向开始扫描的
1 for (int x = 0; x < grayImage1.Width; x++) 2 { 3 for (int y = 0; y < grayImage1.Height; y++) 4 { 5 if (imganalysis.isInArea(x, y, plist)) 6 { 7 grayImgdata[y, x, 0] = 0; 8 } 9 } 10 }
1.首先用emgu自带的Capture类捕获帧
1 Capture capture = new Capture(fileName); 2 frame = capture.QueryFrame();//一帧帧播放
2.扫描(x,y)点是否在框定的区域内,把在框定区域内的点的灰度值置为0
1 Image<Gray, byte> grayImage1 = frame.Convert<Gray, byte>(); 2 Byte[, ,] grayImgdata = grayImage1.Data; 3 4 for (int x = 0; x < grayImage1.Width; x++) 5 { 6 for (int y = 0; y < grayImage1.Height; y++) 7 { 8 if (isInArea(x, y, plist)) 9 { 10 grayImgdata[y, x, 0] = 0;//灰度值置0 11 } 12 } 13 } 14 15 pictureBox1.Image = grayImage1.Bitmap;//在pictureBox上效果 16 17 //方法:专门对于点是否存在于多边形内的判定算法 18 参数x,y为像素点的空间坐标,plist为存储多边形的点的列表 19 public bool isInArea(float x, float y, List<PointF> plist) 20 { 21 int nCount = plist.Count; 22 int nCross = 0; 23 for (int i = 0; i < plist.Count; i++) 24 { 25 PointF p1 = new PointF(scaleHeight * plist[i].X, scaleWidth * plist[i].Y); 26 PointF p2 = new PointF(scaleHeight * plist[(i + 1) % nCount].X, scaleWidth * plist[(i + 1) % nCount].Y); 27 if (p1.Y == p2.Y) // p1p2 与 y=p0.y平行 28 continue; 29 30 if (y < Math.Min(p1.Y, p2.Y)) // 交点在p1p2延长线上 31 continue; 32 33 if (y >= Math.Max(p1.Y, p2.Y)) // 交点在p1p2延长线上 34 continue; 35 36 // 求交点的 X 坐标 -------------------------------------------------------------- 37 38 double xCross = (double)(y - p1.Y) * (double)(p2.X - p1.X) / (double)(p2.Y - p1.Y) + p1.X; 39 40 if (xCross > x) 41 nCross++; // 只统计单边交点 42 } 43 44 // 单边交点为偶数,点在多边形之外 --- 45 46 return (nCross % 2 == 1); 47 }
3 演示效果:正确:
错误:
openCV存储图像的结构和pictureBox存储图像结构的区别
标签:
原文地址:http://www.cnblogs.com/hartigen/p/4634566.html