【问题标题】:OpenCV Hough Cicle Transform sort storage vector [duplicate]OpenCV Hough Cicle Transform 排序存储向量
【发布时间】:2015-02-15 23:54:14
【问题描述】:

我遇到了霍夫圆变换的问题。谁能解释一下这种转换如何对输出数组进行排序?

【问题讨论】:

  • 可能按检测顺序排列。不管这意味着什么;)如果您需要按特殊顺序进行排序,则应按此方式排序。
  • 我有六个圆圈,两个两个的距离很近。我想按中心之间的距离对它们进行排序。
  • 您已经发布了这个问题。如有更改请编辑,请勿重复发布。
  • “按中心之间的距离对它们进行排序”没有得到很好的描述,因为如果有 6 个圆圈,每个圆圈到不同中心的距离有 5 个......而不是排序你想检测“对”?
  • 是的,我想检测对!

标签: c++ opencv image-processing hough-transform


【解决方案1】:

这是明确的问题

我写了一个找到质心的代码,如下所示:

  • 我有 6 个圆圈,每个人都有他的中心质量
  • 我需要将两个两个分组并找到质心之间距离的一半
  • 在这个阶段我有三点
  • 对这三个点求平均值,我确定了一个质心

我不明白如何对存储圆圈日期的向量进行排序。

示例 1

示例 2

这是我的代码

int loadMyFrameWithHough (string framePath){

Mat myFrame1,myFrameGray,myFrameEdge;

myFrame1 = imread(framePath,CV_LOAD_IMAGE_COLOR);

cvtColor(myFrame1,myFrameGray,CV_BGR2GRAY);

vector<Vec3f> circles;

Canny( myFrameGray, myFrameEdge, 50, 150, 3);

HoughCircles( myFrameEdge, circles, CV_HOUGH_GRADIENT, 1, myFrameEdge.rows/10, 100, 9, 50, 90 );

for( int i = 0; i < circles.size(); i++ )
{
  Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
  int radius = cvRound(circles[i][2]);

  string box_text = format("index : %d", i);
  putText(myFrame1, box_text, center, FONT_HERSHEY_PLAIN, 1.0, CV_RGB(0,255,0), 2.0);//afisare index
  circle( myFrame1, center, 3, Scalar(0,0,0), -1, 8, 0 );//centrele cercurilor
  circle( myFrame1, center, radius, Scalar(0,0,0), 3, 8, 0 );//marginile cercurilor
}


float xMassVect[10],yMassVect[10];
int sizeofMass=0;
float xGMass=0,yGMass=0;
float xGmassAns=0,yGmassAns=0;
for( int i = 1; i < circles.size(); i=i+2 )
{

    Point Mass((cvRound(circles[i-1][0])+cvRound(circles[i][0]))/2,(cvRound(circles[i-1][1])+cvRound(circles[i][1]))/2);//masa a doua cate doua cercuri
    circle( myFrame1, Mass, 3, Scalar(0,0,0), -1, 8, 0 );
    sizeofMass=sizeof(Mass.x)-1; //marimea structurii Mass pentru a calcula centrul de greutatate ansamblului ((centru1+centru2+centru3)/3)

}
int k=0;
for (int i=1;i<circles.size();i=i+2)
{
    xMassVect[k]=(cvRound(circles[i-1][0])+cvRound(circles[i][0]))/2;//scrierea coordonatelor x in vector ale lui Mass
    yMassVect[k]=(cvRound(circles[i-1][1])+cvRound(circles[i][1]))/2;//scrierea coordonatelor y in vector ale lui Mass
    xGMass+=xMassVect[k];//suma centrelor de greutate pe x
    yGMass+=yMassVect[k];//suma centrelor de creutate pe y
    k++;
}

for (int k=0;k<circles.size()/2;k++)
{
    cout <<"Coordonate doua cate doua"<<endl;
    cout<<"x["<<k<<"]="<<xMassVect[k];
    cout<<"y["<<k<<"]="<<yMassVect[k];
    cout<<endl;
    xGmassAns+=xMassVect[k];
    yGmassAns+=yMassVect[k];

}
    cout<<"x centruAnsamblu="<<xGmassAns<<endl;
    cout<<"y centruAnsamblu="<<yGmassAns<<endl;

float distance[10];
float sumOfDistance=0;
float optimDistance=0;

for (int k=0;k<circles.size()/2;k++)
{
    distance[k]=sqrt(pow(xMassVect[k]-xGmassAns/(circles.size()/2),2)+pow(yMassVect[k]-yGmassAns/(circles.size()/2),2));//distantele de la centrul ansmblului la centrele cercurilor grupate 2 cate 2
    cout<<"distanta"<<k<<"="<<distance[k]<<endl;
}

for (int i=0;i<circles.size()/2;i++)
{
    sumOfDistance+=distance[i];//suma distantelor
}

    optimDistance=sumOfDistance/sizeofMass;//distanta optima ca medie aritmetica
    cout<<optimDistance;
    Point GmassAns(xGMass/sizeofMass,yGMass/sizeofMass);//centrul de greutate pentru intreg ansamblul
    circle(myFrame1,GmassAns,3,Scalar(10,10,100),-1,8,0);
    circle( myFrame1, GmassAns, optimDistance, Scalar(100,50,50), 3, 8, 0 );



     /// afisare rezultat
    namedWindow( "Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE );
    imshow( "Hough Circle Transform Demo", myFrame1 );
    imshow( "Hough Circle Transform Edge", myFrameEdge );
    string savePath="D:/frame_1.bmp";
            imwrite(savePath,myFrame1);
    waitKey(0);
    return 0;


  }

有没有机会按颜色对带有圆圈数据的向量进行排序? 喜欢 : 数组元素中的两个圆圈:一个红色和一个绿色,彼此靠近?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多