Acces Matrix value without knowing the type opencv

后端 未结 2 614
野的像风
野的像风 2020-12-21 03:06

I am writing a function in which I need to access to a element of a Mat, but this function can receive Mat of differents types. So, if I have:

相关标签:
2条回答
  • 2020-12-21 03:29

    If it is a possibility, make the function receiving the openCV Mat a template function:

    void f<typename T>(const Mat& m)
    {
        (void) m.at<T>(0, 0);
    }
    

    use it like that:

    Mat m1/* ... */;
    m1.at<int>(0, 0) = 0;
    f<int>(m);
    
    0 讨论(0)
  • 2020-12-21 03:37

    You can convert the source matrix to a matrix of double (type CV_64F). In this way you won't lose any data due to casting. Then you can work on this matrix as usual, since you know its type. Last step is to convert back the destination image to the source type.

    You need to know the number of channels of your matrices, though. A CV_assert will make sure that you're working on the correct type.

    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    void foo(const Mat& src, Mat& dst)
    {
        // Assert number of channels
        CV_Assert(src.channels() == 3);
    
        // Convert to CV64F
        Mat3d _src, _dst;
        src.convertTo(_src, CV_64F);
        _dst.create(_src.size());
    
        // Work on _src and _dst (you know the type)
        _dst(0,0) = _src(0,0) + Vec3d(1,2,3);
    
        // Convert _dst to src type
        _dst.convertTo(dst, src.type());
    }
    
    int main()
    {
        Mat3b img(10,10,Vec3b(0,0,0));
    
        Mat res;
        foo(img, res);
    
        // res will be CV_8UC3
    
        return 0;
    }
    

    There are also alternatives to this approach:

    • create a template function an call the appropriate specialization. See here
    • work on raw pointers. See here
    • use only OpenCV functions, that handle correctly every type. See here. This is usually the best option, if available.
    0 讨论(0)
提交回复
热议问题