1

我通常会找到通常出现在我身上的问题的所有答案,不幸的是在这种情况下我找不到解决方案。我有以下代码

Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
for( int i = 0; i< contours.size(); i++ ){
   Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
   drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
   rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
    drawing.at<Vec3i>(centroid[i])[0]=color[0];
    drawing.at<Vec3i>(centroid[i])[1]=color[1];
    drawing.at<Vec3i>(centroid[i])[2]=color[2];
    circle(drawing, centroid[i], 5, color, 3,8,0);
    cout<<centroid[i]<<endl;
    imshow( "Contours", drawing );
    waitKey(0);
 }

问题是质心不在它应该在的地方。这些点的高度相同但宽度错误。我已经使用每个轮廓的圆图检查了“质心”,并且这些点都可以

有人可以帮我解决这个问题吗

4

1 回答 1

3

您正在尝试将 3*32 位分配给大小仅为 3*8 位的字段。您将矩阵定义为 type CV_8UC3,因此您应该使用drawing.at<Vec3b>(...)(其中b代表无符号字符)。您可以在此处找到各种 typedef 。

你可以读CV_xxtCn

  • xx:位数
  • t:类型(F = 浮点类型,S = 有符号整数,U = 无符号整数)
  • n:通道数
于 2012-09-06T07:11:43.170 回答