使用Mat :: at <vec3i>点不指定正确的像素</vec3i>

时间:2012-09-06 06:51:34

标签: c++ image-processing opencv

我通常会找到通常出现给我的问题的所有答案,遗憾的是我在这种情况下无法找到解决方案。我有以下代码

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);
 }

问题是质心不是应该的位置。这些点的高度相同但宽度不对。我已经使用每个轮廓的圆形图检查“质心”,并且点是O.K.

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

1 个答案:

答案 0 :(得分:3)

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

您可以将CV_xxtCn视为

  • xx:位数
  • t:type(F =浮点类型,S =有符号整数,U =无符号整数)
  • n:频道数