openCV存储图像的结构和pictureBox存储图像结构的区别

这段时间在做一个基于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 演示效果:正确:

错误:

 

 

posted @ 2015-07-09 23:44  Joe_Blow  阅读(418)  评论(0编辑  收藏  举报