我通常会找到通常出现给我的问题的所有答案,遗憾的是我在这种情况下无法找到解决方案。我有以下代码
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.
有人可以帮我解决这个问题吗
答案 0 :(得分:3)
您正尝试将3 * 32位分配给大小仅为3 * 8位的字段。您将矩阵定义为CV_8UC3
类型,因此您应该使用drawing.at<Vec3b>(...)
(其中b
代表unsigned char)。您可以找到各种typedef here。
您可以将CV_xxtCn
视为