调用opencv的c接口时,编译提示 对‘cvRound’未定义的引用

该博客讲述了在使用CMake构建项目时遇到的关于OpenCV库中cvRound函数未定义的链接错误,并提到添加-O4-g编译选项可解决。涉及的函数如cvPointFrom32f、cvReadInt和cvEllipseBox都依赖于cvRound。
CMakeFiles/inf2vis.dir/inf2vis_check.c.o:在函数‘cvPointFrom32f’中:
/usr/local/include/opencv2/core/types_c.h:929:对‘cvRound’未定义的引用
/usr/local/include/opencv2/core/types_c.h:930:对‘cvRound’未定义的引用
CMakeFiles/inf2vis.dir/inf2vis_check.c.o:在函数‘cvReadInt’中:
/usr/local/include/opencv2/core/core_c.h:2350:对‘cvRound’未定义的引用
CMakeFiles/inf2vis.dir/inf2vis_check.c.o:在函数‘cvEllipseBox’中:
/usr/local/include/opencv2/imgproc/imgproc_c.h:1041:对‘cvRound’未定义的引用
/usr/local/include/opencv2/imgproc/imgproc_c.h:1042:对‘cvRound’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/inf2vis.dir/build.make:94: recipe for target 'inf2vis' failed
make[2]: *** [inf2vis] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/inf2vis.dir/all' failed
make[1]: *** [CMakeFiles/inf2vis.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

在CMakeList.txt中加入 add_definitions(-O4 -g)后可解决此问题。

<think>嗯,我现在在运行这个OpenCV的代码,遇到了一个未定义的标识符HOUGH_GRADIENT的错误。我的OpenCV版本是2.4.13.6,对吧?那这个问题可能跟版本有关吗?让我先仔细看一下代码。 首先,代码里用了HoughCircles函数,参数中的第四个是HOUGH_GRADIENT。我记得HoughCircles在OpenCV中的参数可能在不同版本有变化。OpenCV 2.x和3.x或者4.x的版本之间是不是有差异呢? 让我查一下OpenCV 2.4.13.6的文档。HoughCircles的函数定义是怎样的?在OpenCV 2.x中,HoughCircles的原型应该是这样的: void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0 ) 这里的第三个参数是method,对应的是HOUGH_GRADIENT吗?在旧版本里,HOUGH_GRADIENT是否被定义了呢?或者是不是在2.x版本里,这个枚举值有不同的名字? 可能的问题在于,在OpenCV 2.x中,HOUGH_GRADIENT的标识符可能不存在,而是用CV_HOUGH_GRADIENT代替?因为OpenCV在更新到3.x之后,很多枚举值去掉了CV_前缀。比如,像颜色转换的COLOR_BGR2GRAY在旧版是CV_COLOR_BGR2GRAY。所以,HOUGH_GRADIENT在2.x里可能应该写成CV_HOUGH_GRADIENT? 让我确认一下。在OpenCV 2.4的文档中,HoughCircles的method参数接受的应该是CV_HOUGH_GRADIENT,而不是HOUGH_GRADIENT。所以用户代码中使用了HOUGH_GRADIENT,导致编译器报未定义的错误,因为正确的名称应该是CV_HOUGH_GRADIENT。 所以解决办法就是把HOUGH_GRADIENT替换成CV_HOUGH_GRADIENT。这样应该就能通过编译了。 不过,可能还有其他需要注意的地方吗?比如函数的其他参数是否在2.4版本中有不同的要求?例如,参数的位置或者默认值。不过用户代码中的参数顺序看起来是对的:dp是1,minDist是edges.rows/8,然后是param1=100,param2=30,最后两个参数是半径范围。这些参数在2.4中是否适用? 是的,HoughCircles的参数在2.4中的顺序是:image, circles, method, dp, minDist, param1, param2, minRadius, maxRadius。用户代码中的参数顺序是正确的,所以问题可能仅在于枚举值的名称。 另外,用户的其他代码是否有兼容性问题?比如morphologyEx的使用,或者其他函数有没有在2.4中被正确支持。例如,IMREAD_GRAYSCALE在2.4中是否存在?是的,它对应的是CV_LOAD_IMAGE_GRAYSCALE,但OpenCV 2.x也支持IMREAD_GRAYSCALE作为枚举值,不过可能需要检查一下。 例如,在2.4中,imread的第二个参数可能应该用CV_LOAD_IMAGE_GRAYSCALE,而IMREAD_GRAYSCALE是在OpenCV 3.0之后引入的。但根据OpenCV的版本,2.x中可能同支持这两种写法,或者需要替换。不过用户可能已经处理好了这个问题,否则可能在编译就会报错。但用户现在的问题是HOUGH_GRADIENT未定义,所以可能IMREAD_GRAYSCALE已经被正确处理,或者用户的环境里该枚举存在。 所以,总结下来,错误的原因是HOUGH_GRADIENT在OpenCV 2.4中的正确名称是CV_HOUGH_GRADIENT。修改这个应该能解决问题。</think>在OpenCV 2.4.13.6版本中,`HOUGH_GRADIENT` 的枚举名称需要添加 `CV_` 前缀。以下是代码修改步骤和详细说明: --- ### **问题定位** 1. **版本差异**:OpenCV 3.0+ 移除了枚举值的 `CV_` 前缀,但2.x版本中必须使用完整名称 `CV_HOUGH_GRADIENT`。 2. **编译错误**:`HOUGH_GRADIENT` 未定义,因为旧版中该标识符不存在。 --- ### **解决方案** 修改 `HoughCircles` 调用部分: ```cpp // 原代码(OpenCV 3.0+语法) HoughCircles(edges, circles, HOUGH_GRADIENT, 1, edges.rows / 8, 100, 30, 1, 30); // 修改为(OpenCV 2.x语法) HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1, edges.rows / 8, 100, 30, 1, 30); ``` --- ### **其他潜在兼容性问题** 1. **图像加载模式**: - OpenCV 2.x 中 `IMREAD_GRAYSCALE` 可能需要替换为 `CV_LOAD_IMAGE_GRAYSCALE`。 ```cpp // 若报错,可尝试修改为: Mat image = imread("E:\\1306.jpg", CV_LOAD_IMAGE_GRAYSCALE); ``` 2. **结构元素类型**: - `MORPH_RECT` 在旧版中可能写作 `CV_SHAPE_RECT`,但 `MORPH_RECT` 在2.4中通常仍有效。 --- ### **完整修改后代码** ```cpp Mat image = imread("E:\\1306.jpg", CV_LOAD_IMAGE_GRAYSCALE); // 加载灰度图 Mat edges; Mat kernel_rect = getStructuringElement(MORPH_RECT, Size(3, 5)); // 3x5矩形 morphologyEx(image, image, MORPH_OPEN, kernel_rect, Point(-1, -1), 2); // 开运算2次 threshold(image, image, 0, 255, THRESH_BINARY + THRESH_OTSU); // Otsu二值化 imshow("开", image); Canny(image, edges, 50, 150, 3); // Canny边缘检测 vector<Vec3f> circles; // 使用CV_HOUGH_GRADIENT适配OpenCV 2.x HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1, edges.rows / 8, 100, 30, 1, 30); for (size_t i = 0; i < circles.size(); i++) { Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); int radius = cvRound(circles[i][2]); circle(image, center, radius, Scalar(255, 255, 255), 3); circle(image, center, 3, Scalar(255, 255, 255), 3); // 圆心 } imshow("圆检测", image); imwrite("E:\\圆检测.jpg", image); ``` --- ### **验证步骤** 1. **重新编译**:确保所有枚举值适配OpenCV 2.x。 2. **路径检查**:确认输入/输出路径 `E:\\1306.jpg` 和 `E:\\圆检测.jpg` 存在且可写。 3. **参数调优**:若检测效果不佳,可调整 `HoughCircles` 的阈值参数(如 `param2=30` 控制圆检测灵敏度)。 --- ### **附加说明** 若需升级到OpenCV 3.x/4.x: 1. 将 `CV_HOUGH_GRADIENT` 恢复为 `HOUGH_GRADIENT`。 2. 替换已弃用的枚举(如 `CV_LOAD_IMAGE_GRAYSCALE` → `IMREAD_GRAYSCALE`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值