如何将 ROI 边界矩形与主图像坐标对齐
How to align ROI bounding rectangle to main image coordinate
我正在从图像中解码 QR 码,因为图像很大并且有其他不需要的图形,所以我在代码周围绘制 roi 并对其进行解码。一切正常,但是当我尝试在 QR 码周围绘制边界框时,它被绘制在其他地方。如何将矩形与主图对齐?
这就是我得到的 - 红色矩形是 roi,绿色矩形是边界框。
代码如下:
Image<Gray, byte> Gray_Image = My_Image.Convert<Gray, byte>();
Gray_Image.ROI = Coderect;
Gray_Image._Not();
CvInvoke.cvThreshold(Gray_Image,Gray_Image,50,255.0,Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
Gray_Image.Dilate(5);
StructuringElementEx element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT);
CvInvoke.cvMorphologyEx(Gray_Image, Gray_Image, IntPtr.Zero, element, Emgu.CV.CvEnum.CV_MORPH_OP.CV_MOP_CLOSE, 18);
var contour = Gray_Image.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);
CvInvoke.cvRectangle(My_Image, new Point(contour.BoundingRectangle.X, contour.BoundingRectangle.Y), new Point(contour.BoundingRectangle.X + contour.BoundingRectangle.Width, contour.BoundingRectangle.Y + contour.BoundingRectangle.Height), new MCvScalar(0, 255, 0), 4, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, 0);
pictureBox1.Image = My_Image.Bitmap;
我找到了解决方案。
因为我知道 roi 的 (roiX,roiY) 并且我也知道边界框的 (bbX,bbY,bbW,bbH)。
通过添加 roi 的 X 和边界框的 X,我得到了位置的 X,对于 Y 也是如此。
我只需要执行以下操作:
cvInvoke.cvRectangle(My_Image, new Point(roiX+bbX, roiY+bbY), new Point((roiX+bbX)+bbW,(roiY+bbY)+bbH), new McvScalar(0,255,0), Line_Type.Eight_Connected,0);
我正在从图像中解码 QR 码,因为图像很大并且有其他不需要的图形,所以我在代码周围绘制 roi 并对其进行解码。一切正常,但是当我尝试在 QR 码周围绘制边界框时,它被绘制在其他地方。如何将矩形与主图对齐?
这就是我得到的 - 红色矩形是 roi,绿色矩形是边界框。
代码如下:
Image<Gray, byte> Gray_Image = My_Image.Convert<Gray, byte>();
Gray_Image.ROI = Coderect;
Gray_Image._Not();
CvInvoke.cvThreshold(Gray_Image,Gray_Image,50,255.0,Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
Gray_Image.Dilate(5);
StructuringElementEx element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT);
CvInvoke.cvMorphologyEx(Gray_Image, Gray_Image, IntPtr.Zero, element, Emgu.CV.CvEnum.CV_MORPH_OP.CV_MOP_CLOSE, 18);
var contour = Gray_Image.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);
CvInvoke.cvRectangle(My_Image, new Point(contour.BoundingRectangle.X, contour.BoundingRectangle.Y), new Point(contour.BoundingRectangle.X + contour.BoundingRectangle.Width, contour.BoundingRectangle.Y + contour.BoundingRectangle.Height), new MCvScalar(0, 255, 0), 4, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, 0);
pictureBox1.Image = My_Image.Bitmap;
我找到了解决方案。 因为我知道 roi 的 (roiX,roiY) 并且我也知道边界框的 (bbX,bbY,bbW,bbH)。 通过添加 roi 的 X 和边界框的 X,我得到了位置的 X,对于 Y 也是如此。
我只需要执行以下操作:
cvInvoke.cvRectangle(My_Image, new Point(roiX+bbX, roiY+bbY), new Point((roiX+bbX)+bbW,(roiY+bbY)+bbH), new McvScalar(0,255,0), Line_Type.Eight_Connected,0);