OpenCV 2.3:如何将每个轮廓的所有孔放入子向量中
OpenCV 2.3: How to put all holes for each contour into subvector?
对于每个轮廓,我想把它的孔放入单独的矢量<>的洞。默认在OpenCV 2中。*我们有两个选择-使用OpenCV 1。*树形结构并迭代它,如本教程所示,让我们的头围绕vector<Vec4i>
,这是有点简化,但相同的OpenCV 1.0类似的树形结构,它依赖于std::vector< std::vector<Point> >
,你可以从findContours
获得。当你需要了解继承——"什么被放在什么里面"时,树是很有用的。但通常你只需要一组区域和它的洞。(用于向量化和类似任务)。
目前我有这样的代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main( )
{
Mat black = Mat::zeros(Size(100, 100), CV_8UC1);
for(int i = 0; i <= 35; ++i)
{
for (int k = 0; k <=35; ++k)
{
black.row(i).col(k) = 255;
}
}
for(int i = 10; i <= 15; ++i)
{
for (int k = 10; k <=15; ++k)
{
black.row(i).col(k) = 0;
}
}
for(int i = 25; i <= 30; ++i)
{
for (int k = 25; k <=30; ++k)
{
black.row(i).col(k) = 0;
}
}
for(int i = 45; i <= 75; ++i)
{
for (int k = 45; k <= 75; ++k)
{
black.row(i).col(k) = 255;
}
}
for(int i = 55; i <= 65; ++i)
{
for (int k = 55; k <=65; ++k)
{
black.row(i).col(k) = 0;
}
}
for(int i = 57; i <= 62; ++i)
{
for (int k = 57; k <=62; ++k)
{
black.row(i).col(k) = 255;
}
}
namedWindow("Display Image", CV_WINDOW_AUTOSIZE);
imshow("Display Image", black);
std::vector< std::vector<Point> > contours;
vector<Vec4i> hierarchy;
if(sum(black).val[0] > 0.0)
{
findContours(black, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
}
else
{
std::cout << "It's a black image, so I'm not going to do anything..." << std::endl;
}
for(int i = 0; i < contours.size(); ++i)
{
std::cout << "counter " << i << ":" << std::endl;
std::cout << hierarchy[i][0] << " " << hierarchy[i][1] << " " << hierarchy[i][2] << hierarchy[i][3] << std::endl;
for (int k = 0; k < contours[i].size(); ++k)
{
std::cout << "t point " << k << " x: " << contours[i][k].x << "; y: " << contours[i][k].y << std::endl;
}
}
waitKey(0);
std::cin.get();
return 0;
}
我想知道是否有可能将std::vector< std::vector<Point> > contours;
更改为类似std::vector< std::pair<std::vector<Point>, std::vector<std::vector<Point> > > contours;
的东西,其中对由其孔的轮廓矢量组成。它是可能的,以及如何实现这样的事情与openCV 2.3?
我的意思是像这样的东西(糟糕的,糟糕的C风格…)代码片段我创建:
struct vector_object
{
std::vector<Point> border;
std::vector< std::vector<Point> > holes;
};
std::vector<vector_object> container;
void store_vector_hole(std::vector< std::vector<Point> > &holes, std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid);
void store_vectror_countors(std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid);
void store_vector_hole(std::vector< std::vector<Point> > &holes, std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid)
{
holes.push_back(contours[cid]);
if (hierarchy[cid][2] >= 0) // holes in holes == real poligons
{
store_vectror_countors( contours, hierarchy, hierarchy[cid][2]);
}
if (hierarchy[cid][0] >= 0) // holes on same level of depth == another holes of this poligon
{
store_vector_hole(holes, contours, hierarchy, hierarchy[cid][0]);
}
return;
}
void store_vectror_countors(std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid)
{
if (hierarchy[cid][0]>= 0)
store_vectror_countors(contours, hierarchy, hierarchy[cid][0]);
vector_object current;
current.border = contours[cid];
if ((hierarchy[cid][0]<= 0) && (hierarchy[cid][2] <= 0))
{
container.push_back(current);
return;
}
if(hierarchy[cid][2] >= 0) // h
{
store_vector_hole(current.holes, contours, hierarchy, hierarchy[cid][2]);
}
container.push_back(current);
return;
}
:
//...
findContours(black, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
store_vectror_countors(contours, hierarchy, 0);
有什么想法让它更健壮,更像c++吗?
标题>您是否尝试将它们提取为轮廓树?在findContours上使用CV_RETR_TREE标志,它应该会给出您想要的结果。
相关文章:
- 输入验证将数字放入向量中
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 读取访问冲突. _Mycont 在 C++ 中将 udp 数据放入向量时出现 nullptr 错误
- 如何从文件中读取 n 个字节并使用<uint8_t>迭代器将它们放入向量中?
- 读取.txt文件并将每行放入向量
- 如何将文件中的数字放入向量中
- 如何将数据线放入向量
- 如何将 v4l2 中的数据放入 c++ 向量
- 如何将部分初始化的结构对象放入向量
- 将字符串放入向量中会得到空字符串
- 如何将字符串的元素放入向量
- 仅叮当:一对<路径,路径>可以放入向量中;一对也可以<unique_ptr,unique_ptr>;但不能成对<路径,unique_ptr>:为什么?
- C++如何将目录中的文件名放入向量中
- 将函数放入向量中并执行
- C++不能将数据放入向量中
- 我有麻烦将字符串放入向量字符串
- OpenCV 2.3:如何将每个轮廓的所有孔放入子向量中
- 在c++中读取多列并将它们放入向量中
- 为什么这段代码在试图将.txt放入向量并对其进行cout时会返回空白控制台
- 如何将字符串放入向量中