我想查找一个“十”字白色图形的中心,应该怎么算呢? 我有一个摄像头,以及能够截图了,图像是一个黑底上有两个十字光标(较大个,多数时间是没有倾斜的)的图形,亮度一浅一深我想图像识别,找出两个十字的中心,之后计算其中心的差距。请问应该怎么编程呢?如果太复杂可以先告诉我一个十字应该怎么识别? 二值化之后我就没想到更好的处理方法了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你都二值化了还有什么不能做的。。可以用X和Y两个方向的直方图投影,然后找到能量最高的两个点坐标,X1、X2和Y1、Y2,那么(X1,Y1)、(X2,Y2)就是你要的两个十字中心N个十字也是这么做只要十字在投影方向上不重叠。。 以一个倾斜十字为例试着找了一下中心点,没优化,不知道行不行。 int centerx = -1; int centery = -1; Bitmap bp; public Form1() { InitializeComponent(); } unsafe private void button1_Click_1(object sender, EventArgs e) { bp = (Bitmap)Bitmap.FromFile("e:\\test.bmp"); BitmapData data = bp.LockBits(new Rectangle(0, 0, bp.Width, bp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); Dictionary<uint, List<Point>> colorpoints = new Dictionary<uint, List<Point>>(); uint* p = (uint*)data.Scan0; for (int i = 0; i < bp.Width; i++) { for (int j = 0; j < bp.Height; j++) { uint color = p[j * bp.Width + i]; if (!colorpoints.Keys.Contains(color)) colorpoints.Add(color, new List<Point>()); else colorpoints[color].Add(new Point(i, j)); } } var cross = colorpoints.OrderByDescending(x => x.Value.Count).Select(y => y.Key).ToArray()[1]; List<Point> list = colorpoints[cross]; int leftx = list.Min(x => x.X); int rightx = list.Max(x => x.X); int topy = list.Min(x => x.Y); int bottomy = list.Max(x => x.Y); centerx = (leftx + rightx) / 2; centery = (topy + bottomy) / 2; for (int i = centerx - 10; i < centerx + 11; i++) { for (int j = centery - 10; j < centery + 11; j++) { p[j * bp.Width + i] = 0xffffffff; } } bp.UnlockBits(data); Invalidate(); } protected override void OnPaint(PaintEventArgs e) { if(centerx == -1) return; e.Graphics.DrawImage(bp, new Point(0, 0)); } 直接用估计不行,我用PowerPoint画的图,本应该只有黑白两种颜色,保存成图片后还是出现了五种。你用摄像头拍的照片估计杂色就更多了,得先降噪。否则万一不知道哪儿跑出一个小小的和十字一样的像素就谬以千里了。 var cross = colorpoints.OrderByDescending(x => x.Value.Count).Select(y => y.Key).ToArray()[1]这句不知道什么意思 能解释一下吗? 关于形心计算问题,代码,请看http://dongtingyueh.blog.163.com/blog/static/46194532011427105715472/http://dongtingyueh.blog.163.com/blog/static/461945320126238303158/ AFORGE里面有,你百度一下,下载了,直接可以调用,我当时做的是行人流量检测,用到了连通域判断,整个工程测试为25帧每秒,实时性完全可以!!! AFORGE里面有,你百度一下,下载了,直接可以调用,我当时做的是行人流量检测,用到了连通域判断,整个工程测试为25帧每秒,实时性完全可以!!! 回复了好几次了,一直显示不出来....AForge里面有现成的代码,你百度一下,直接调用,我当时做的是行人流量自动检测,用到了这个,整个工程测试为25帧/S,实时性完全可以!!! 回复了好几次了,一直显示不出来....AForge里面有现成的代码,你百度一下,直接调用,我当时做的是行人流量自动检测,用到了这个,整个工程测试为25帧/S,实时性完全可以!!! http://img.my.csdn.net/uploads/201209/12/1347443809_5125.JPG 。 这个是两个光斑一样亮度的情况,基本上求最亮两点就可以了。但我想做得比较通用的 菜鸟 问个对大家来说比较弱智的问题,什么是[线程安全的]啊. 文件重命名…… MP3的ID3V2标签大小怎么计算的? 面试归来 找人帮我到www.codeproject.com找样东西 用c#开发oracle数据库系统,请问访问数据库时我用OleDb呢--还是OracleClient呢? 请问哪里可以下载C#电子图书 菜鸟问题。。。。。。。解决马上给分!!!多谢! 求教一个关于字符串处理的问题 求助,怎样实现系统电源管理 c# 如何做成QQ系统头像那样的图片列表 为什么ExecuteScalar返回object类型?
int centerx = -1;
int centery = -1;
Bitmap bp;
public Form1()
{
InitializeComponent();
} unsafe private void button1_Click_1(object sender, EventArgs e)
{
bp = (Bitmap)Bitmap.FromFile("e:\\test.bmp");
BitmapData data = bp.LockBits(new Rectangle(0, 0, bp.Width, bp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
Dictionary<uint, List<Point>> colorpoints = new Dictionary<uint, List<Point>>();
uint* p = (uint*)data.Scan0;
for (int i = 0; i < bp.Width; i++)
{
for (int j = 0; j < bp.Height; j++)
{
uint color = p[j * bp.Width + i];
if (!colorpoints.Keys.Contains(color))
colorpoints.Add(color, new List<Point>());
else
colorpoints[color].Add(new Point(i, j));
}
}
var cross = colorpoints.OrderByDescending(x => x.Value.Count).Select(y => y.Key).ToArray()[1];
List<Point> list = colorpoints[cross];
int leftx = list.Min(x => x.X);
int rightx = list.Max(x => x.X);
int topy = list.Min(x => x.Y);
int bottomy = list.Max(x => x.Y);
centerx = (leftx + rightx) / 2;
centery = (topy + bottomy) / 2;
for (int i = centerx - 10; i < centerx + 11; i++)
{
for (int j = centery - 10; j < centery + 11; j++)
{
p[j * bp.Width + i] = 0xffffffff;
}
}
bp.UnlockBits(data);
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
if(centerx == -1)
return;
e.Graphics.DrawImage(bp, new Point(0, 0));
}
var cross = colorpoints.OrderByDescending(x => x.Value.Count).Select(y => y.Key).ToArray()[1]
这句不知道什么意思 能解释一下吗?
http://dongtingyueh.blog.163.com/blog/static/461945320126238303158/