有幾種方法可以實現您的目標。我將給出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