C++ FindContours如何在图像中循环?OpenCV 2.3

C++ FindContours如何在图像中循环?OpenCV 2.3,c++,visual-studio-2010,opencv,image-processing,C++,Visual Studio 2010,Opencv,Image Processing,我们正在编写一个程序,该程序从网络摄像头获取输入,减去除绿色值以外的所有颜色,找到分离的斑点并计算它们。最终,这将作为一个视频游戏的输入,但这是无关紧要的 所讨论的代码并不是实际执行所有这些操作的代码,而是一段重写的代码,用于测试FindContours的实际工作方式。 通常,在imageprocessing中,我们一直认为图像是从左上角到右下角读取的,但经过一些测试后,它似乎做了完全相反的事情,从右下角开始,移动到左上角 所以这里的问题是:被发现的恐龙是按什么顺序找到它的轮廓的?我的假设是对的

我们正在编写一个程序,该程序从网络摄像头获取输入,减去除绿色值以外的所有颜色,找到分离的斑点并计算它们。最终,这将作为一个视频游戏的输入,但这是无关紧要的

所讨论的代码并不是实际执行所有这些操作的代码,而是一段重写的代码,用于测试FindContours的实际工作方式。 通常,在imageprocessing中,我们一直认为图像是从左上角到右下角读取的,但经过一些测试后,它似乎做了完全相反的事情,从右下角开始,移动到左上角

所以这里的问题是:被发现的恐龙是按什么顺序找到它的轮廓的?我的假设是对的还是我自己的代码让我困惑

输入:

#包括
#包括
#包括
#包含//用于睡眠功能
使用名称空间cv;
使用名称空间std;
空隙隔离绿(最低层、层和移动层)
{
Mat inImg(最小行数、最小列数、CV_8UC3、标量(1,2,3));
inImg.data=最小数据;
通道化垫(inImg.rows、inImg.cols、CV_8UC1);
垫通道绿色(inImg.rows、inImg.cols、CV_8UC1);
Mat通道蓝(inImg.rows、inImg.cols、CV_8UC1);
Mat outImg[]={信道化、信道绿色、信道蓝色};
int fromTo[]={0,2,1,1,2,0};
混合频道(&inImg,1,outImg,3,fromTo,3);
移动=(通道绿色)-(通道红色+通道蓝色);
阈值(mOut,mOut,5255,THRESH_二进制);
侵蚀(mOut,mOut,Mat(),点(-1,-1),1);
扩张(mOut,mOut,Mat(),点(-1,-1),2);
}
无效查找组件(Mat&mDst、Mat mGreenScale、向量和向量等高线、向量和向量层次、Mat img)
{
//这始终是空的。我们需要它来避免崩溃。
向量层次2;
//mGreenScale=mGreenScale>1;///可能完全不需要
mDst=img>1;
findContours(矢量缩放、矢量轮廓、矢量层次结构、,
CV_RETR_CCOMP,CV_CHAIN_近似_简单);
/*颜色,按顺序排列:
第一名=红色
第二名=深红色
第三名=紫色
蓝色
5号=淡蓝色
绿色
橄榄绿
深绿色
*/
int-aRed[]={255、100、128、0、191、0、202、0};
int aGreen[]={0,0,0,0,239,255,255,100};
int-aBlue[]={0,0,128,255,255,0,112,0};
字符串颜色[]={“红色”、“深红色”、“紫色”、“蓝色”、“浅蓝色”、“绿色”、“浅绿色”、“深绿色”};
//检查vecHierarchy(else){crash}:P中是否有任何内容非常重要
//函数drawContours无法处理空的层次结构
if(vecHierarchy!=vecHierarchy2)
{
//遍历所有顶级轮廓,
对于(int idx=0;idx>=0;idx=vecHierarchy[idx][0])
{ 
//使用固定颜色绘制每个连接的组件
标量颜色(aBlue[idx]、AGREN[idx]、aRed[idx]);
绘制轮廓线(mDst、vecContours、idx、颜色、/*1*/CV_填充、8、vecHierarchy);

cout如果您关心OpenCV实现的细节,顺便说一句,OpenCV是一个开源库,您可以自己阅读它

<> >强> >警告>强:C++ API使用了一些代码,包括代码> FordCuthOutsUnter()/Cuff>。因此,如果你检查文件:<代码>模块/IMGPROC/SRC/CONTROS.CPP < /C>行>强> 1472 < /强>你将看到这个函数的C++实现:

1472 void cv::findContours( InputOutputArray _image, OutputArrayOfArrays _contours,
1473                    OutputArray _hierarchy, int mode, int method, Point offset )
1474 {
1475     Mat image = _image.getMat();
1476     MemStorage storage(cvCreateMemStorage());
1477     CvMat _cimage = image;
1478     CvSeq* _ccontours = 0;
1479     if( _hierarchy.needed() )
1480         _hierarchy.clear();
1481     cvFindContours(&_cimage, storage, &_ccontours, sizeof(CvContour), mode, method, offset);
1482     if( !_ccontours )
1483     {
1484         _contours.clear();
1485         return;
1486     }
调用
cvFindContours()
,它来自C API,在该文件的1424行定义

扫描过程本身在位于第794行的
cvFindNextContour()
中描述:

793 CvSeq *
794 cvFindNextContour( CvContourScanner scanner )
795 {
你可以清楚地看到:

824     for( ; y < height; y++, img += step )
825     {
826         for( ; x < width; x++ )
827         {
(;y824 825 { 826用于(;x
谢谢你的回答-但是!我似乎不能完全掌握答案。我可以看到数学的工作方式,但它不能提供任何方向的洞察力。它从哪个像素开始,在哪里结束?我是一个初学者,顺便说一句,请容忍我。:)
824     for( ; y < height; y++, img += step )
825     {
826         for( ; x < width; x++ )
827         {