OpenCV 4.10 for Delphi中HoughCircles()函数使用疑问求助
OpenCV 4.10 for Delphi中HoughCircles调用问题解决
问题核心
你的代码存在两个关键问题:
- 变量类型不匹配:
HoughCircles返回的是包含三个浮点值(圆心x、圆心y、半径)的向量,你使用Vector<TVec4i>(四元素整数向量)作为输出容器,类型不兼容导致调用报错。 - 圆数量获取方式缺失:不知道如何通过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
相关产品推荐
相关产品推荐

