Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV-Hough-Cicle变换排序存储向量_C++_Opencv_Image Processing_Hough Transform - Fatal编程技术网

C++ OpenCV-Hough-Cicle变换排序存储向量

C++ OpenCV-Hough-Cicle变换排序存储向量,c++,opencv,image-processing,hough-transform,C++,Opencv,Image Processing,Hough Transform,我在Hough圆变换中遇到问题。有人能解释一下这个转换是如何对输出数组进行排序的吗 这是一个明确的问题 我编写了一个代码,可以找到重心,如下所示: 我有6个圆圈,每个圆圈都有重心 我需要把两个一个地分组,找出重心之间距离的一半 在这一阶段,我有三点 取这三个点的平均值,我确定一个质心 我不知道如何对矢量进行排序,这些矢量存储了圆圈的日期 示例1 示例2 这是我的代码 int loadMyFrameWithHough (string framePath){ Mat myFrame1,my

我在Hough圆变换中遇到问题。有人能解释一下这个转换是如何对输出数组进行排序的吗

这是一个明确的问题

我编写了一个代码,可以找到重心,如下所示:

  • 我有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;


  }
int loadMyFrameWithHough(字符串帧路径){
Mat myFrame1,myFrameGray,myFrameEdge;
myFrame1=imread(帧路径、CV\u加载\u图像\u颜色);
CVT颜色(myFrame1、myFrameGray、CV_BGR2GRAY);
矢量圆;
Canny(myFrameGray,myFrameEdge,50,150,3);
HoughCircles(myFrameEdge,圆形,CV_HOUGH_渐变,1,myFrameEdge.rows/10100,9,50,90);
对于(int i=0;i对于(int i=1;我可能是按检测顺序。不管这意味着什么;)如果你需要特殊的顺序,你应该这样排序。我有六个圆圈,两个两个在一个小距离。我想按中心之间的距离排序。你已经发布了这个问题。如果有什么变化,请编辑它,不要发布重复的。“按中心之间的距离排序”并没有很好的描述,因为如果有6个圆,每个圆到不同的中心有5个距离…你不想排序,而是想检测“对”?是的,我想检测对!