有几种方法可以实现您的目标。我将给出OpenCvSharp的代码,对于普通的C++来说它是相似的。
尝试在图像周围添加一些中性边框。例如,您可以在源图像周围添加10-20像素的白色。它可能会产生错误的轮廓,但您的图像目标部分仍然不在角落。
Mat img = Cv2.ImRead("test.jpg");
Mat imgExtended = new Mat(new OpenCvSharp.Size(img.Size().Width + 40, img.Size().Height + 40), MatType.CV_8UC3, Scalar.White);
OpenCvSharp.Rect roi = new OpenCvSharp.Rect(new OpenCvSharp.Point(20, 20), img.Size());
img.CopyTo(imgExtended.SubMat(roi));
img = imgExtended;
Mat coloredImage = img.Clone();
Cv2.CvtColor(img, img, ColorConversionCodes.BGR2GRAY);
OpenCvSharp.Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.Canny(img, result, 80, 150);
Cv2.FindContours(result, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
您有对象和几乎白色的背景。你可以做任何阈值操作,然后采取最大的一团。
更新。 在这两种情况下,图像顶部的黑线和左角的黑色区域仍然可能是问题。在这种情况下,你可以通过该功能
double Cv2.ContourArea(Point[] Contour);
选择面积最大的轮廓,然后尝试创建边框,这将最大限度地减少错误。
如果您分享一些样本图片或其他相关图片,效果会更好。 – 2014-09-24 07:54:29
Thx编辑!当然,我附上样品:[样品1](http://s019.radikal.ru/i632/1409/e3/9b867ca286a7.jpg),[样品2](http://i003.radikal.ru/1409/12/990fc8613b1f .JPG) – 2014-09-25 00:12:49