(图象识别)getPixel的效率慢, 有没有其他的高效方法!

Harvey_He 2009-04-18 05:19:22
我现在做图象识别这块,我用getPixel 和 setPixel发放来处理Bitmap图像,如果放到线程里面批量处理大量图片的话就会很慢!有没有其他的方法改进?

例如:

//把图象变成单色的图
public void singlBmp(Bitmap bit)
{

Color c = new Color();
Color cc = new Color();
int rr, gg, bb;

for (int i = 0; i < bit.Width; i++)
{
for (int j = 0; j <bit.Height; j++)
{
c = bit.GetPixel(i, j);
rr = rrIn[c.R];


cc = Color.FromArgb(rr, rr, rr);
bit.SetPixel(i, j, cc);
}
}
}
//如果放到线程里面会很卡,处理的很慢

...全文
832 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgke 2009-04-20
  • 打赏
  • 举报
回复
如果不使用不安全代码

可以使用

然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来
Harvey_He 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wjwu1988 的回复:]
给你写一个吧。。。。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。

C# codeusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
namespace neicun
{
public partial class Form1 : Form
{
public Form1()
{

[/Quote]

有一点你错了:
for (int x = 0; x < dataIn.Width; x++)
{
pOut[0] = pIn[0];
pOut[1] = pIn[0];
pOut[2] = pIn[0];

pIn += 3;
pOut += 3;
}


freewind0521 2009-04-18
  • 打赏
  • 举报
回复
up
蚊子的 2009-04-18
  • 打赏
  • 举报
回复
给你写一个吧。。。。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
namespace neicun
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Bitmap m_Bmp = new Bitmap("d:\\nvhai.bmp");
int h = m_Bmp.Height;
int w = m_Bmp.Width;

Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);

BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

unsafe
{
byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
byte* pOut = (byte*)(dataOut.Scan0.ToPointer());

for (int y = 0; y < dataIn.Height; y++)
{
for (int x = 0; x < dataIn.Width; x++)
{

pOut[1] = pOut[0];
pOut[2] = pOut[0];

pIn += 3;
pOut += 3;
}

pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
}

bmpOut.UnlockBits(dataOut);
m_Bmp.UnlockBits(dataIn);
pictureBox1.Image = bmpOut;
}
}
}
boywangliang 2009-04-18
  • 打赏
  • 举报
回复
学习帮顶
tsp860901 2009-04-18
  • 打赏
  • 举报
回复
不了解 顶顶再说
gomoku 2009-04-18
  • 打赏
  • 举报
回复
我所知道的图象处理和识别,很少直接用Bitmap类,或者说很多用自己的数据结构,比如OpenCV用cvImage。

如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧