2017-01-10 3 views
4

У меня есть изображение, на которое вы нажимаете 2 точки, и создает линию между каждой точкой. В конце концов, о чем просит этот отдел, есть возможность рассчитать длину этих строк и где эти линии произошли. В настоящее время они делают это вручную/бумага/ручка/линейка. Это одно из изображений, с которыми я работаю.Есть ли лучший способ обработки областей изображения?

Example Image

Эти трещины в середине считаются "область 7".

Так что мне нужен был способ, кроме сохранения моего местоположения x, чтобы измерить линии позже, также добавьте местоположение, которое они попали в мой список. Ниже я единственный способ сделать это, но это доказывает, что это беспорядок. Поскольку изображение не является точным квадратом или прямоугольником, есть много перекрывающихся областей и много областей, где будут пустоты, что зоны не покрываются очень хорошо.

Есть ли лучший способ сделать это? (В настоящее время я только с помощью MessageBox, чтобы показать, где я щелкнул, я не пошел так далеко, как делать что-либо с данными пока, пока я не получить это право.)

if (e.Button.Equals(MouseButtons.Left)) 
    { 
     Rectangle zone1 = new Rectangle(35, 30, 770, 30); 
     if (zone1.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone1");     
     } 
     Rectangle zone2 = new Rectangle(890, 40, 330, 300); 
     if (zone2.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone2"); 
     } 
     Rectangle zone3 = new Rectangle(340, 340, 850, 60); 
     if (zone3.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone3"); 
     } 
     Rectangle zone4 = new Rectangle(100, 25, 75, 300); 
     if (zone4.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone4"); 
     } 
     //4-1 trying to cover areas missed in zone4 
     Rectangle zone41 = new Rectangle(255, 270, 120, 240); 
     if (zone41.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone4-1"); 
     } 
     Rectangle zone5 = new Rectangle(310, 100, 180, 150); 
     if (zone5.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone5"); 
     } 
     //5-1 trying to cover areas missed in zone5 
     Rectangle zone51 = new Rectangle(220, 80, 60, 45); 
     if (zone51.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone5-1"); 
     } 
     Rectangle zone6 = new Rectangle(635, 35, 250, 210); 
     if (zone6.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone6"); 
     } 
    } 
+0

Сгенерировано ли сгенерированное изображение из векторных данных, или вы, как предполагается, должны распознавать функцию? Если последнее, это одноразовая вещь, или ее нужно автоматизировать? Если это одноразовый, вы можете вручную создать изображение для каждого региона (например, заполнить каждый регион черным цветом для соответствующего изображения) и проверить на пиксель, было ли место, которое пользователь нажал, в этом регионе. Ответ зависит от ваших ограничений. – adv12

+0

Re: в том числе «C#» в названии, на самом деле я думал, что это было неодобрительно. Но, может быть, «правила» изменились. – adv12

+2

_ «Редактирование этого, чтобы включить C# в заголовке в соответствии с запросом» _ - это странно, потому что [общее согласие заключается в том, что теги не должны включаться в заголовки] (http://meta.stackexchange.com/questions/19190/should- вопросы-include-tags-in-them-titles) – stuartd

ответ

2

Мое предложение заключается в том, что вам используйте фоновое изображение как карту зоны. Это изображение не будет отображаться для пользователя вообще. Вы загружаете его один раз и сохраняете в памяти, но продолжаете отображать исходное изображение и нарисовать на нем строки, как обычно. Затем, когда пользователь нажимает на ваше изображение, вы определяете цвет карты зоны, чтобы определить зону.

Например, предположим, что я использую эти два изображения, как мой дисплей и и моей зоны карты:

Zone display Zone map

Оба изображения загружаются в ваш код, но только карта дисплей показано пользователю:

class MyForm 
{ 
    Bitmap zoneDisplay; 
    Bitmap zoneMap; 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     zoneDisplay = (Bitmap)Image.FromFile(@"c:\temp\zonedisp.png"); // replace with actual path to file 
     zoneMap = (Bitmap)Image.FromFile(@"c:\temp\zonemap.png"); 

     // put the display image into the picturebox (or whatever control displays it) 
     pictureBox.Image = zoneDisplay; 
    } 

Затем, когда пользователь нажимает на изображение, просто проверить цвет на карте зоны:

private void pictureBox_MouseDown(object sender, MouseEventArgs e) 
{ 
    var color = _zoneMap.GetPixel(e.X, e.Y); 
    if (color == Color.FromArgb(0, 0, 255)) 
     MessageBox.Show("Zone 1"); 
    else if (color == Color.FromArgb(255, 0, 0)) 
     MessageBox.Show("Zone 2"); 
    else if (color == Color.FromArgb(0, 255, 0)) 
     MessageBox.Show("Zone 3"); 
    // etc... 
} 

Если ваши цвета слегка отшлифованы, вам может потребоваться выполнить менее точное сравнение. Пример:

static int ColorDelta(Color c1, Color c2) 
{ 
    return Math.Abs(c1.R - c2.R) + Math.Abs(c1.G - c2.G) - Math.Abs(c1.B - c2.B); 
} 

private void pictureBox_MouseDown(object sender, MouseEventArgs e) 
{ 
    var color = _zoneMap.GetPixel(e.X, e.Y); 
    if (90 > ColorDelta(color, Color.FromArgb(0, 0, 255))) 
     MessageBox.Show("Zone 1"); 
    else if (90 > ColorDelta(color, Color.FromArgb(255, 0, 0))) 
     MessageBox.Show("Zone 2"); 
    else if (90 > ColorDelta(color, Color.FromArgb(0, 255, 0))) 
     MessageBox.Show("Zone 3"); 
    // etc... 
} 
+0

Звучит здорово. Позвольте мне немного поработать над тем, что я оставил здесь в офисе, и я отправлю обратно. – Lee

+0

О, и в случае, если это не было очевидно, вы должны использовать формат изображения без потерь, например BMP или PNG. Не используйте JPG для вашей карты зоны, потому что она искажает цвета. – RogerN

+0

Я использую PNG. Я открыл 2 копии своего изображения. Я вручную окрашивал области для зон, используя простой цвет RGB в краске, (красный, зеленый, синий и т.д.) использовал вышеприведенный код для загрузки их и для мыши, и он, похоже, не работает. Является ли только раскраска в области моей карты изображений неправильным способом сделать это? Я новичок в этом методе, но я не вижу, где он сравнивает 2 изображения, может быть? – Lee

 Смежные вопросы

  • Нет связанных вопросов^_^