ورود

View Full Version : تشخیص چندضلعی در تصویر



ali_72
پنج شنبه 10 اردیبهشت 1394, 10:52 صبح
سلام
برای پردازش تصویر در سی شارپ از کتابخانه Emgu استفاده می کنم.
من به خوبی می تونم در مورد تصاویر مستطیل شکل کار موردنظرم را انجام بدم
ولی در مورد اشکال نا منتظم یا چندضلعی مثل متوازی الاضلاع
کد من به مشکل برمیخوره در ضمن من بکگراند معمولا شلوغی دارم
از تابع GetConvexHull استفاده کردم ولی چون تصویر ماسک شده کاملا واضح نیست در راس های چندضلعی حالت گرد دارم

لطفا راهنمایی کنید


private void Process(Image<Hsv, byte> image) {

//با استفاده از تابع InRange بر روی تصویر مورد نظر بازه رنگ مورد نظر رو اصطلاحا Mask می کنیم.
//که در نتیجه یک تصویر سفید ( پیکسل های دیگر) و سیاه (پیکسل های درون بازه ) خواهیم داشت.
_maskedImage =
image.InRange(
new Hsv(Convert.ToDouble(numericUpDownHmin.Value), Convert.ToDouble(numericUpDownSmin.Value),
Convert.ToDouble(numericUpDownVmin.Value)),
new Hsv(Convert.ToDouble(numericUpDownHmax.Value), Convert.ToDouble(numericUpDownSmax.Value),
Convert.ToDouble(numericUpDownVmax.Value)));
//Eroding و Dilating
//دو تابع تغییر شکل
_maskedImage = _maskedImage.Erode((int)numericUpDown1.Value);
//انبساط
_maskedImage = _maskedImage.Dilate((int)numericUpDown2.Value);
var _contour = _maskedImage.FindContours(CHAIN_APPROX_METHOD.CV_C HAIN_APPROX_SIMPLE,
RETR_TYPE.CV_RETR_EXTERNAL, new MemStorage());


double _result1 = 0;


double _result2 = 0;
var _biggestContour1 = _contour;


while (_contour != null)
{
_result1 = _contour.Area;
if (_result1 > _result2)
{
_result2 = _result1;
_biggestContour1 = _contour;
}
_contour = _contour.HNext;
}


if (_biggestContour1 != null)
{
var d = _biggestContour1.GetMinAreaRect();

//Rectangle
//image.Draw(d, new Hsv(100, 255, 255), 1);

//Polygon-در راس های چند ضلعی گرد میشه
image.Draw(_biggestContour1.GetConvexHull(ORIENTAT ION.CV_CLOCKWISE), new Hsv(255, 255, 255), 1);


imageBox2.Image = _maskedImage;
imageBox1.Image = image;
}
}