none
Recortar Imagem ao movimentar retângulo em tempo de execução - EmguCV - OpenCV RRS feed

  • Pergunta

  • Olá!

    Estou enfrentando o seguinte problema:

    Meu caso:

    Tenho duas Picturebox (pb) A e B em Forms diferentes. Quero ao movimentar o retângulo no pbA eu quero que a imagem do seu interior seja exibida no pbB.

    Para fazer o recorte:

    Mat A = new Mat(img, rect); // Sendo img a Mat de entrada e rect o retângulo

    Ele funciona, desde que o retângulo não seja movimentado

    Erro:  OpenCV: 0<=roi.x && 0<= roi.width && roi.x +roi.width <= m.cols && <= roi.y && 0 <= roi.height <= m.rows

                

    Código para criar e movimentar o retângulo:

    private void pb_imageRecorte_Paint(object sender, PaintEventArgs e)
            {
                if (rect.X < 0) rect.X = 0;
                if (rect.Y < 0) rect.Y = 0;
                if (rect.X + rect.Width > pb_imageRecorte.Width) rect.X = pb_imageRecorte.Width - rect.Width;
                if (rect.Y + rect.Height > pb_imageRecorte.Height) rect.Y = pb_imageRecorte.Height - rect.Height;

                using (Pen pen = new Pen(Color.LimeGreen, 1))
                {
                    e.Graphics.DrawRectangle(pen, rect);
                }
            }

            private void pb_imageRecorte_MouseDown(object sender, MouseEventArgs e)
            {
                start_X = e.X;
                start_Y = e.Y;

                if (rect.Contains(e.Location))
                {
                    pb_imageRecorte.MouseMove -= pb_imageRecorte_MouseMove_NotDown;
                    pb_imageRecorte.MouseMove += pb_imageRecorte_MouseMove_MovingSegment;
                    pb_imageRecorte.MouseUp += pb_imageRecorte_MouseUp_MovingSegment; 

                    OffsetX = rect.X - e.X;
                    OffsetY = rect.Y - e.Y;
                }
                else
                {
                    pb_imageRecorte.MouseMove += pb_imageRecorte_MouseMove_NotDown;
                }
            }

            private void pb_imageRecorte_MouseMove_NotDown(object sender, MouseEventArgs e)
            {
                Cursor new_cursor = Cursors.Arrow;
                if (rect.Contains(e.Location))
                    new_cursor = Cursors.Hand;
                if (pb_imageRecorte.Cursor != new_cursor)
                    pb_imageRecorte.Cursor = new_cursor;
            }
            private void pb_imageRecorte_MouseMove_MovingSegment(object sender, MouseEventArgs e)
            {
                int new_x1 = e.X + OffsetX;
                int new_y1 = e.Y + OffsetY;

                int dx = new_x1 - rect.X;
                int dy = new_y1 - rect.Y;

                if (dx == 0 && dy == 0) return;

                rect = new Rectangle(rect.X + dx, rect.Y + dy, 50, 50);

                // Redraw.
                pb_imageRecorte.Invalidate();
            }
            private void pb_imageRecorte_MouseUp_MovingSegment(object sender, MouseEventArgs e)
            {
                pb_imageRecorte.MouseMove += pb_imageRecorte_MouseMove_NotDown;
                pb_imageRecorte.MouseMove -= pb_imageRecorte_MouseMove_MovingSegment;
                pb_imageRecorte.MouseUp -= pb_imageRecorte_MouseUp_MovingSegment;

                pb_imageRecorte.Invalidate();
            }

    Agradeço desde já!

    quarta-feira, 25 de maio de 2016 01:05

Todas as Respostas

  • Aparentemente meu problema está nas coordenadas.

    Pois se eu exibir as coordenas elas estão assumindo valores negativos. 

    • Marcado como Resposta Thales F Quintas sexta-feira, 27 de maio de 2016 13:53
    • Não Marcado como Resposta La.Scalea sábado, 28 de maio de 2016 02:31
    quarta-feira, 25 de maio de 2016 04:06