Как нарисовать точки (с плавающим значением) на растровом изображении? - PullRequest
0 голосов
/ 03 апреля 2012

Я снял видео и вынул его кадр, преобразовал его в растровое изображение, и теперь я могу показать его на картинке.

У меня есть несколько точек с плавающей точкой, которые являются возвращаемыми значениями функции GoodFeaturesToTrack () из класса изображений.

Теперь я хочу нарисовать / показать эти точки / метки на разных Си, Yi поверх моей картинки;

Как это возможно? какую команду я должен использовать?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

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

Вот (неполный) пример, иллюстрирующий эту мысль. Примечание: вам может потребоваться настроить вызовы на подписи CV, объявленные вашей оберткой:

    private int maxPointCount = 16;
    private CvPoint2D32f[] points = new CvPoint2D32f[maxPointCount];
    private CvImage grayImage = new CvImage(size, CvColorDepth.U8, CvChannels.One);
    private CvImage eigenValues = new CvImage(size, CvColorDepth.F32, CvChannels.One);
    private CvImage tempImage = new CvImage(size, CvColorDepth.F32, CvChannels.One);

    public int FeatureRadius { get; set; }

    private CvScalar featureColor; 
    public Color FeatureColor
    {
        get
        {
            return Color.FromArgb((byte)featureColor.Value2, (byte)featureColor.Value1, (byte)featureColor.Value0);
        }
        set
        {
            featureColor.Value0 = value.B;
            featureColor.Value1 = value.G;
            featureColor.Value2 = value.R;
        }
    }

    public void Process(CvImage input, CvImage output)
    {
        CV.ConvertImage(input, grayImage);
        CV.GoodFeaturesToTrack(grayImage, eigenValues, tempImage, points, ref maxPointCount, 0.01, 10, IntPtr.Zero, 3, 0, 0.04);
        CV.Copy(input, output);

        // This draws a circle around the feature points found
        for (int i = 0; i < pointCount; i++)
            CV.Circle(output, new CvPoint((int)points[i].X, (int)points[i].Y), FeatureRadius, featureColor);
    }
0 голосов
/ 03 апреля 2012

Добавьте обработчик для события PictureBox.Paint и сделайте там свой рисунок. Если вам нужно обновить чертежный вызов Invalidate() на вашем элементе управления PictureBox, чтобы перерисовать.

void PictureBox_Paint(object sender, PaintEventArgs e) {

  // draw points from var pointsList = List<Point>
  foreach (Point p in pointsList) {
    e.Graphics.DrawEllipse(Pens.Yellow, p.X - 2, p.Y - 2, 4, 4);
  }
}
...