private void обрезатьToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrResume != Resume.Cutting) return; // сохраняем отступ по которому будет обрезание изображения _offset.X += trbLeftPosition.Value; _offset.Y += trbUpPosition.Value; // определяем позицию текущего изображения на форме int pos = _images.IndexOf(_currImage); // обрезаем изображение на форме _images[pos] = CutBitmapImage(_images[pos], trbLeftPosition.Value, trbRightPosition.Value, trbUpPosition.Value, trbDownPosition.Value); Segmentation segmentationOrigin = new Segmentation(GetCorrectedPoints(), trbToleranceLimit.Value); byte[,,] originMas = segmentationOrigin.GetSegmentedMass(_images[pos]); SuperImposition superImposition = new SuperImposition(originMas); Segmentation segmentation = new Segmentation(_keyPoints, trbToleranceLimit.Value); for (int i = 0; i < _images.Count; i++) { if (i == pos) continue; byte[, ,] currMas = segmentation.GetSegmentedMass(_images[i]); Point offset = superImposition.FindBestImposition(currMas, new Point(trbLeftPosition.Value, trbUpPosition.Value)); _images[i] = CutBitmapImage(_images[i], offset, _images[pos].Width, _images[pos].Height); } _currImage = _images[pos]; pbGoodChipImage.Image = _currImage; // сбрасываем показания контролов trbRightPosition.Value = 0; trbLeftPosition.Value = 0; trbUpPosition.Value = 0; trbDownPosition.Value = 0; RefreshCuttingLabels(); SetDimensionsOfPositionTrackBars(_currImage); }
/// <summary> /// Конструктор принимает объект проекта отбраковки /// </summary> /// <param name="cullingProject">Ссылка на объект проекта отбраковки</param> /// <param name="islandLimit">Минимальный размер островка несоответствующих пикселей, которые не игнорируются</param> /// <param name="sumIslandLimit">Максимальный размер суммы пикселей в неигнорируемых островках, при котором чип считается годным</param> public VisualInspect(CullingProject cullingProject, int islandLimit, int sumIslandLimit) { _islandLimit = islandLimit; _sumIslandLimit = sumIslandLimit; // сохраняем проект отбраковки _cullingProject = cullingProject; // сохраняем сегментированное изображение годного чипа _segmentedMassGoodChip = cullingProject.UnitedImage; // находим края изображения годного чипа EdgeFinder edgeFinder = new EdgeFinder(_segmentedMassGoodChip); _edgeNearAreaMas = edgeFinder.GetEdgeNearArea(EdgeRadius); // фиксируем размеры массива _heightOfGood = _segmentedMassGoodChip.GetUpperBound(0) + 1; _widthOfGood = _segmentedMassGoodChip.GetUpperBound(1) + 1; // создаем объект для нахождения лучшего совмещения _superImposition = new SuperImposition(_segmentedMassGoodChip) { AcceptablePercent = ImpositionAcceptablePercent }; }