如何像矩阵元素一样访问opencv中的vector<vector<Point>>轮廓?

Posted

技术标签:

【中文标题】如何像矩阵元素一样访问opencv中的vector<vector<Point>>轮廓?【英文标题】:How to access vector<vector<Point>> contours in opencv like matrix element? 【发布时间】:2012-09-29 06:46:41 【问题描述】:

我的问题是我不知道如何访问vector &lt;vector &lt;Point&gt;&gt; 轮廓(这是 OpenCV 上的二维矩阵)

我想这样做。如果 Mat 元素不包含在轮廓区域中,我想抑制该矩阵元素。为了做到这一点,我也需要知道轮廓元素。

【问题讨论】:

【参考方案1】:

第一个和第二个向量都需要一个 for 循环。像这样的:

vector< vector<Point> > contours;

for(int i= 0; i < contours.size(); i++)

    for(int j= 0; j < contours[i].size();j++) // run until j < contours[i].size();
    
        cout << contours[i][j] << endl; //do whatever
    

【讨论】:

感谢您的回复。但我不明白你的帖子 for loop?int i;i=0;i 成功了。我还有一个问题,我的轮廓并不像我预期的那样精确 findContours(img1,rgbcontours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0) );你有什么诀窍吗? 只是一个简短的评论,如果你想访问实际的xy 坐标,cv::Point 结构有xy 成员,所以int x = contours[i][j].x; 和@ 987654328@将分别访问会员。顺便说一句,我前一阵子投了赞成票。想添加此评论并感谢您。 +1。【参考方案2】:

如果我的情况如此紧急,我会更仔细地问我的问题。

如果我努力理解你的问题,你基本上想考虑像素级的轮廓。为此,您应该使用 drawContour 将轮廓绘制到空白矩阵中。然后比较两个矩阵或匹配该矩阵中的一个像素,以防您需要逐个像素。

【讨论】:

好的,你很好地回答了我的问题。轮廓来自 RGB,我想将此轮廓像素位置与另一个深度图像对应的像素位置进行比较。 ,为了抑制深度图像的某些像素。我正在使用 kinect 传感器,而且我无法准确找到对象轮廓,在我的情况下,轮廓不准确。如何找到精确的轮廓?【参考方案3】:

如果您需要所有点而不仅仅是边缘点,您可以使用drawContours(....,thickness=CV_FILLED) 将此轮廓转储到虚拟垫上,然后您可以通过扫描虚拟垫获得这些点。

【讨论】:

如果你是从最新的 opencv repo 编译,那么它应该是 FILLED 而不是 CV_FILLED

以上是关于如何像矩阵元素一样访问opencv中的vector<vector<Point>>轮廓?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 opencv 库将 3D 矩阵的元素归零?

如何在 OpenCV 中访问高维矩阵的元素?

简单的opencv问题,如何把一个vector中的值传递给mat?

vector 中如何修改某一个元素的值?

访问opencv矩阵CV_32S元素

OpenCV:访问 5D 矩阵的元素