我正在使用c#开发与实时监控相关的程序,就像研究一样。
我不打算使用opencv或emgu等库,因为在某些情况下我需要对像素进行详细调整或在访问所有像素后进行处理。
现在我的算法基本上使用Lockbits
和UnlockBits
将像素值复制到二维字节数组中,然后我可以执行任何我希望从该字节数组中检索数据的过程。
对于那个数组,我用自定义结构声明它:
struct Pixel
{
Byte B;
Byte G;
Byte R;
}
所以当我处理RGB位图时,我可以简单地使用:bmp[i,j].R, bmp[i,j].G, bmp[i,j].B
分别访问RGB值。
然而,这个方法会导致很长的处理时间,当位图的分辨率很大时,根据我的经验,320x240很好,但是当我处理704x480时,整个系统都停滞不前。
我想知道有没有其他方法可以一次访问所有像素,比我的更快,或者还有其他技术可以进行实时视频监控?
由于
答案 0 :(得分:0)
取决于你的工作。
首先,不安全的代码和指针是一种更快的访问方式。可以明显更快。
其次,根据您的操作,将其加载到d3d表面并使用 - directx。
答案 1 :(得分:0)
这里有很多值得讨论......
1)如你所说,将其固定在内存中然后通过指针访问它,而不是像.NET数组那样检查数据结构。
2)如果您以特定模式访问数据,请考虑转置/预处理数据。位图通常按行存储在内存中,但如果您按列访问,性能将下降。例如,如果您需要按列或一个通道访问,请在处理之前旋转图像或分离通道。
3)使您的像素处理代码更有效。
4)并行化(如果可能)。
5)使用GPU: - )
.NET中有很好的OpenCV包装器。 Emgu是其中之一,并在其免费版本中提供CUDA支持。