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*8 ビットしかないフィールドに 3*32 ビットを割り当てようとしています。行列を type と定義したので、 ( whereは unsigned char を表しCV_8UC3ます) を使用する必要があります。ここでさまざまな typedef を見つけることができます。drawing.at<Vec3b>(...)b

CV_xxtCnとして読むことができます

  • xx: ビット数
  • t: 型 (F = 浮動小数点型、S = 符号付き整数、U = 符号なし整数)
  • n: チャンネル数
于 2012-09-06T07:11:43.170 に答える