惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
博客园 - Franky
腾讯CDC
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
V
V2EX
N
Netflix TechBlog - Medium
量子位
Jina AI
Jina AI
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
爱范儿
爱范儿
博客园 - 叶小钗
D
Docker
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss

博客园 - 鹅要长大

【ubuntu基础】rsync命令的理解与使用 【ubuntu基础vim使用】vi/vim粘贴自动缩进问题 【ubuntu基础】使用sshfs挂载远程主机目录 【c++编程基础】理解lambda表达式 【c++编程基础】字节对齐pack的理解 【c++编程基础】虚函数virtual的理解与使用 【linux基础知识】理解nohup 【linux基础】如何理解python train_dtld.py 2>&1 | tee my_error_log.txt 【工具使用】docker的使用 【基础算法】银行家舍入法 【ubuntu工具】ubuntu好用工具总结 【ubuntu基础工具使用】ubuntu中screen的安装与使用 【linux操作基础】多目录文件复制且同名不覆盖 【linux基础操作】windows系统生成的txt文件在ubuntu打开乱码 【c++编程基础】std::unique的理解 【编程基础】计算三个顶点之间的夹角 【计算几何算法】道格拉斯普克(Douglas-Peuker)算法 [c++]c++ 工程代码中的debug时条件编译隐去的代码会影响程序运行的性能和耗时吗 【CV基础】语义分割任务计算类别权重 【opencv基础】resize使用的问题 git stash的用法 gflags的使用 opencv 判断某个坐标点是否在多边形内cv::pointPolygonTest 判断多边形的顶点内外角点以及对approxPolyDP函数的理解 用Python从零实现贝叶斯分类器 【CV数据集】智慧城市之CCPD车牌数据集
【opencv编程基础】fillpoly和polylines函数的理解
鹅要长大 · 2025-02-14 · via 博客园 - 鹅要长大

前言

最近编程实现车辆边界接地线算法时,遇到fillpoly函数的使用问题,特此记录。

具体问题

调试时定位的错误代码:

            cv::Mat mask_parking = cv::Mat::zeros(segImg.size(), CV_8UC1);
            cv::fillPoly(mask_parking, cur_parking, cv::Scalar(255));

其中cur_parking数据类型是std::vector<cv::Point>

出现错误:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.5) /tmp/tmp.fAVojfHTaz/modules/core/src/matrix_wrap.cpp:50: error: (-215:Assertion failed) i < 0 in function 'getMat_'

Aborted (core dumped)

查看资料发现是fillpoly函数的参数类型有问题;

修改后的代码:

            cv::Mat mask_parking = cv::Mat::zeros(segImg.size(), CV_8UC1);
            std::cout << __FUNCTION__ << __LINE__ << ", fillPoly mask_parking start..." << std::endl;
            std::vector<std::vector<cv::Point>> pcur_parking;
            pcur_parking.emplace_back(cur_parking);
            cv::fillPoly(mask_parking, pcur_parking, cv::Scalar(255));

错误解决。

其他

c++ opencv fillpoly函数的注意事项博文中记录,在python中, cv2.polylines和cv2.fillpoly对于参数pts的要求是一致的,而在c++中是不一致的。

python:

# --------------画多边形---------------------
image = cv2.polylines(image , [pts], True, (255, 255, 255))
##-------------填充多边形---------------------
image = cv2.fillPoly(image , [pts], (255, 255, 255))

c++:

polylines(image , pts, true, (255, 255, 255));

vector<vector<Point>> ppts;
ppts.push_back(pts);
fillPoly(image , ppts, (255, 255, 255));

由此得出结论,很明显,c++中polylines函数和fillPoly函数所需参数不同,fillPoly函数需要二维嵌套vector<vector> ppts;,否则无法正常使用。若使用vector pts;,会导致程序中断,但不会在编译器中报错。

参考

1. c++ opencv fillpoly函数的注意事项