C++ OpenCV-Hough-Cicle变换排序存储向量
我在Hough圆变换中遇到问题。有人能解释一下这个转换是如何对输出数组进行排序的吗 这是一个明确的问题 我编写了一个代码,可以找到重心,如下所示: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
- 我有6个圆圈,每个圆圈都有重心
- 我需要把两个一个地分组,找出重心之间距离的一半
- 在这一阶段,我有三点
- 取这三个点的平均值,我确定一个质心
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个距离…你不想排序,而是想检测“对”?是的,我想检测对!