在我的应用程序中,我在线处理图像(1920x400),帧速率高达350 fps。从这些图像中,我连续计算出位于图像中间的黑色物体的区域。物体通常有很少的白洞。
Example for you to get an idea of images
Example for you to get an idea of images
用于计算当前在阈值(B / W)图像上使用emguCV函数CvInvoke.CountNonZero(Mat)的区域I&m。这个解决方案运行得很好,但我的问题是漏洞,这可能会错误地显示结果。
我试图使用形态侵蚀来填补空洞
if (erodeEnable)
{
Mat kernel = new Mat(5, 5, DepthType.Cv8U, 1);
kernel.SetTo(new MCvScalar(1));
CvInvoke.Erode(postProcessTempMat, postProcessTempMat, new Mat(5, 5, DepthType.Cv8U, 1), new System.Drawing.Point(0,0), erodeIterations, BorderType.Default, new MCvScalar(0, 0, 0));
}
但是此操作会显着改变对象形状。我想填补这些洞,但如果不改变则保持外形。
我也尝试使用我自己的方法,逐列搜索第一个上下黑色像素,并从这些像素的位置计算外形的面积。
public int getBlackArea(Mat matImage)
{
Image<Gray, Byte> tempImg = matImage.ToImage<Gray, Byte>();
int result = 0;
int coll = 0;
int upperBorder, lowerBorder;
const int avFactor = 3;
result = 0;
for (coll = 0; coll < tempImg.Width; coll=coll+avFactor)
{
lowerBorder = 0;
while ((tempImg.Data[lowerBorder,coll, 0] > 0) && (lowerBorder < tempImg.Height))
{
lowerBorder++;
}
upperBorder = iMAGEhEIGHT - 1;
while ((tempImg.Data[upperBorder,coll, 0] > 0) && (upperBorder > 0))
{
upperBorder--;
}
result += ((upperBorder - lowerBorder) * avFactor);
//tempImg.Data[(upperBorder-5), coll, 0] = 120; // draw the outline for check of function
//tempImg.Data[(lowerBorder+5), coll, 0] = 120; // draw the outline for check of function
}
//tempImg.Save(@"C:\\pics\INFOoutlined.jpg");
return result;
}
这种方法可以获得非常好的结果,但是时间要求太高了。
你有什么想法,如何提高我的功能以加快速度?或者你没有任何其他想法,我怎么能达到结果呢?
非常感谢提前:)