剪切图像以移动运行时矩形-EmguCV-OpenCV-C#

剪切图像以移动运行时矩形-EmguCV-OpenCV-C#,c#,opencv,emgucv,rect,C#,Opencv,Emgucv,Rect,目标: 在另一个Picturebox中显示移动矩形内部的图片 也就是说,有两个不同的Picturebox(PB)A和B形式。我想在PBA中移动矩形,我想在PBB中显示其内部图像 可能的解决办法: 剪切图像并在另一个picturebox中显示剪切图 要进行切割,请执行以下操作: Mat A = new mat ( img , rect ) ; // Being img input Mat and rect rectangle 只要矩形不忙,它就可以工作。那不是很忙 然后返回错误 Error:

目标: 在另一个Picturebox中显示移动矩形内部的图片

也就是说,有两个不同的Picturebox(PB)A和B形式。我想在PBA中移动矩形,我想在PBB中显示其内部图像

可能的解决办法:

剪切图像并在另一个picturebox中显示剪切图

要进行切割,请执行以下操作:

 Mat A = new mat ( img , rect ) ; // Being img input Mat and rect rectangle
只要矩形不忙,它就可以工作。那不是很忙

然后返回错误

Error: OpenCV : 0 < = roi.x && 0 < = roi.width && roi.x + roi.width < = m.cols && < = roi.y && 0 < = roi.height < = m.rows
 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();
    }
        private void cropMat(Mat input)
    {
        Mat output = new Mat(input.Height, input.Width, Emgu.CV.CvEnum.DepthType.Cv8U, input.NumberOfChannels);
        Mat inputROI = new Mat(input, rect);
        Mat outputROI = new Mat(output, rect);
        inputROI.CopyTo(outputROI);
        delPassData arquivo = new delPassData(Z.RecebeIMG);
        arquivo(inputROI);
    }