/// <summary> /// 霍夫直线变换 /// </summary> private void DrawHoughLines(HoughsArgs e) { VectorOfPointF lines = new VectorOfPointF(); CvInvoke.HoughLines(mTempImage, lines, e.Rho, Math.PI / 180, e.Threshold); //便于绘制,再转成彩色图 CvInvoke.CvtColor(mTempImage, mTempImage, ColorConversion.Gray2Bgr); for (int i = 0; i < lines.Size; i++) { double rho = lines[i].X; double theta = lines[i].Y; double a = Math.Cos(theta); double b = Math.Sin(theta); double x0 = a * rho; double y0 = b * rho; int x1 = (int)(x0 + 1000 * (-b)); int y1 = (int)(y0 + 1000 * (a)); int x2 = (int)(x0 - 1000 * (-b)); int y2 = (int)(y0 - 1000 * (a)); CvInvoke.Line(mTempImage, new Point(x1, y1), new Point(x2, y2), e.Color, e.Thickness); } }
private void FrmHoughs_PassValuesEvent(object sender, HoughsArgs e) { mTempImage = mCurrentImage.Clone(); //如果是彩色图,先灰度化 if (mTempImage.NumberOfChannels != 1) { CvInvoke.CvtColor(mTempImage, mTempImage, ColorConversion.Bgr2Gray); } switch (e.HoughTransType) { case HoughTransformType.Line: DrawHoughLines(e); break; case HoughTransformType.LineP: DrawHoughLinesP(e); break; case HoughTransformType.Circle: DrawHoughCircles(e); break; default: break; } mFrmMainImage.SetImageSource(mTempImage); }
/// <summary> /// 霍夫圆变换 /// </summary> private void DrawHoughCircles(HoughsArgs e) { VectorOfPointF vectorOfPointF = new VectorOfPointF(); CvInvoke.HoughCircles(mTempImage, vectorOfPointF, HoughType.Gradient, 1, e.Threshold); //ToDo: 霍夫圆变换效果无效,原因未明 for (int i = 0; i < vectorOfPointF.Size; i++) { //var a = "fs"; } }
/// <summary> /// 统计概率霍夫直线变换 /// </summary> private void DrawHoughLinesP(HoughsArgs e) { LineSegment2D[] lines = CvInvoke.HoughLinesP(mTempImage, e.Rho, Math.PI / 180, e.Threshold); //便于绘制,再转成彩色图 CvInvoke.CvtColor(mTempImage, mTempImage, ColorConversion.Gray2Bgr); for (int i = 0; i < lines.Length; i++) { CvInvoke.Line(mTempImage, lines[i].P1, lines[i].P2, e.Color, e.Thickness); } }