我是C 的新手。我试图找到自己的形状顶点,并在它们周围绘制圆圈。我在这条主要功能的行中绘制圆圈:
drawVertices(getDrawingVertices(getAllPoints()), src_clone);
我认为我的drawVertices()
功能都可以:
void drawVertices(vector<Point> drawingVertices, Mat src_clone) {
for( int i = 0; i < drawingVertices.size(); i++ ){
circle(src_clone, drawingVertices[i], 5, Scalar(255), 3, 8);
}
}
,但使用getDrawingVertices()
函数并非一切顺利。当我尝试将一个向量元素的值分配给另一个向量元素时,我的应用程序会崩溃:
drawingVertices[i] = pointsArray[topLength];
完整的功能代码getDrawingVertices()
在这里:
vector<Point> getDrawingVertices (vector<Point> pointsArray) {
int N = pointsArray.size();
int numberOfDrawingVertices = 8;
vector<Point> drawingVertices(numberOfDrawingVertices);
vector<int> lengthArray(N);
Point centerPoint = findCenter();
for (int i = 0; i < N; i++) {
lengthArray[i] = floor(pow((pow((pointsArray[i].x - centerPoint.x),2) +
pow((pointsArray[i].y - centerPoint.y),2)),0.5));
}
for (int i = 0; i < 8; i++) {
int topLength = 0;
for (int j = 0; j < N; j++) {
if (lengthArray[j] > lengthArray[topLength]) {
topLength = j;
}
}
drawingVertices[i] = pointsArray[topLength];
lengthArray[topLength] = 0;
}
return drawingVertices;
}
这是函数守则getAllPoints ()
:
vector<Point> getAllPoints () {
vector<Point> pointsArray;
for( int i = 0; i < contours.size(); i++ ){
for (int j = 0; j < contours[i].size(); j++) {
pointsArray.push_back(contours[i][j]);
}
}
return pointsArray;
}
编辑
功能findCenter()
:
Point findCenter() {
vector<Moments> mu(contours.size() );
for( int i = 0; i < contours.size(); i++ ){
mu[i] = moments( contours[i], false );
}
vector<Point2f> mc( contours.size() );
for( int i = 0; i < contours.size(); i++ ) {
mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 );
}
int SumX = 0;
int SumY = 0;
int pointCol = 0;
for(int j= 0; j < mc.size();j++) {
SumX += mc[j].x;
SumY += mc[j].y;
pointCol++;
}
Point centerPoint;
centerPoint.x = floor(SumX/pointCol);
centerPoint.y = floor(SumY/pointCol);
return centerPoint;
}
我有错误的地方?
您应该自己调试代码。
如果您的应用在此行崩溃
drawingVertices[i] = pointsArray[topLength];
您应该检查drawingVertices
和pointsArray
的长度,以及i
和topLength
。检查i>=0
,i<drawingVertices.size()
,以及pointsArray
和topLength
的相同。如果其中一种条件不遵守,请检查何时以及如何错误。
(在旁注上,而不是POW(x,0.5(使用SQRT(X(。但是它没有连接到您的问题。(