You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV 4.10 for Delphi中HoughCircles()函数使用疑问求助

OpenCV 4.10 for Delphi中HoughCircles调用问题解决

问题核心

你的代码存在两个关键问题:

  1. 变量类型不匹配:HoughCircles返回的是包含三个浮点值(圆心x、圆心y、半径)的向量,你使用Vector<TVec4i>(四元素整数向量)作为输出容器,类型不兼容导致调用报错。
  2. 圆数量获取方式缺失:不知道如何通过Vector容器获取检测到的圆的总数。

修正方案

1. 修正变量类型

将存储圆的容器改为Vector<TVec3f>(三元素浮点向量),单个圆的变量对应改为TVec3f——因为HoughCircles返回的坐标和半径是浮点型,后续用cvRound转换为整数即可适配绘图需求。

2. 获取圆的数量

OpenCV Delphi绑定中的Vector类提供了Size()方法,直接调用就能得到检测到的圆的总数。

3. 修正HoughCircles调用

确保参数类型与函数要求完全匹配,尤其是输出容器的类型。

修正后的完整代码

procedure TForm1.FindCircles(const AMat: TMat);
const
  Param1 = 100;
  Param2 = 30;
  RadiusMin  = 1;
  RadiusMaks = 300;
var
  ImgGray: TMat;
  Circles: Vector<TVec3f>; // 改为三元素浮点向量,匹配HoughCircles输出格式
  Circle: TVec3f;
  CirclesCount: integer;
  Radius: integer;
  Center: TPoint;
  i: integer;
begin
  cvtColor(AMat, ImgGray, COLOR_BGR2GRAY);
  MedianBlur(ImgGray, ImgGray, 3); 

  try
    // 类型匹配后调用HoughCircles
    HoughCircles(ImgGray, Circles, CV_HOUGH_GRADIENT, 1,
                      ImgGray.rows/16, Param1, Param2, RadiusMin, RadiusMaks);

    CirclesCount := Circles.Size(); // 获取检测到的圆的数量
    if CirclesCount > 0 then begin
      for i := 0 to CirclesCount - 1 do begin
        Circle := Circles[i];  

        // 将浮点坐标转换为整数点
        Center := Point(cvRound(Circle[0]), cvRound(Circle[1]));
        Radius := cvRound(Circle[2]);

        // 绘制圆心标记和圆轮廓
        cv.OpenCV.Circle(ImgGray, Center, 1, Scalar(0, 100, 100), 3);
        cv.OpenCV.Circle(ImgGray, Center, Radius, Scalar(255, 0, 255), 3);
      end;
    end;
  finally
    ImgGray.copyTo(AMat);
    ImgGray.release();
  end;
end;

关键说明

  • Vector<TVec3f>:每个元素对应一个圆的三个参数,索引0为圆心x坐标,索引1为圆心y坐标,索引2为半径,均为浮点型。
  • Circles.Size():直接返回Vector中存储的圆的数量,无需额外判断Empty(Size为0时循环不会执行)。
  • cvRound():将浮点型的坐标和半径转换为整数,适配Delphi的TPoint和绘图函数的整数参数要求。

内容的提问来源于stack exchange,提问作者GRU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:44:56