OpenCVMatで動作するルーチンがいくつかあります。これはそれらの1つです:
void drawCircles(Mat& image, const Mat points, Scalar color)
{
    // fix format of Matrix <-> hard coding
    //MatInfo(points);
    //getchar();
    CV_Assert(points.channels() == 2);
    //CV_Assert(points.depth() == CV_32FC2); // this is so restricted!!
    //CV_Assert(points.channels() == 2);
    //CV_Assert(points.depth() == CV_16UC2); 
    // added working for both row/col point vector
    Point2d p0;
    for (int i = 0; i < points.cols; i++)
    {   
        //p0.x = cvRound(points.at<Vec2i>(0,i)[0]);
        //p0.y = cvRound(points.at<Vec2i>(0,i)[1]);
        p0.x = cvRound(points.at<Vec2f>(0,i)[0]);
        p0.y = cvRound(points.at<Vec2f>(0,i)[1]);
        //p0.x = cvRound(points.at<Vec2d>(0,i)[0]);
        //p0.y = cvRound(points.at<Vec2d>(0,i)[1]);
        circle(image, p0, 5, color, 2, 8);
    }
}
これは、特定のポイントで画像上に円を描くために使用されます。
matrixA.at(i、j)でMatの要素にアクセスできます。ただし、これは非常に具体的です。行列の要素タイプが異なる場合、関数は機能しません。この場合、一種のテンプレート関数を書くことは可能ですか?マットの要素タイプに依存しないのはどれですか?
ありがとうございました
Edit01:
それが次のようなものなら
template <class T> 
void drawCircles(Mat_<T> img, const Mat points, Scalar cl)
{
  ..
  img.at<T>() = something;
  ..
}
それなら完璧でしょう。しかし、私はOpenCVのドキュメントで検索を行ったので、これがOpenCVMATでサポートされているとは思いません。それとも私はいくつかのポイントを逃していますか?
Edit02:これは私の試みです:
template <class Type>
void drawCircles(Mat& image, const Mat_<Vec<Type, 2> > points, Scalar color)
{
    for (int i = 0; i < points.cols; i++)
    {
        p0.x = cvRound(points.at<Vec<Type, 2>>(0,i)[0]);
        p0.y = cvRound(points.at<Vec<Type, 2>>(0,i)[1]);
        circle(image, p0, 5, color, 2, 8);
    }
}
そして私はそれを次のように呼びます:
drawCircles(frame, Points, Scalar(255, 255, 255));
ポイントは次のとおりです。
Mat Points = Mat(1, 5, CV_32FC2, 0);
それでもうまくいきません:(