目标: 在另一个Picturebox中显示移动矩形内部的图片。
也就是说,有两个Picturebox(PB)A和B表单不同。我想在PBA中移动矩形我希望它的内部图像出现在PBB中。
可能的解决方案:
剪切图像并在另一个图片框中显示剪切
进行剪辑:
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);
}