C++ cv::Mat,在不知道矩阵类型的情况下获取行-列的值

C++ cv::Mat,在不知道矩阵类型的情况下获取行-列的值,c++,opencv,matrix,C++,Opencv,Matrix,所以我试图用行和列的值得到矩阵的值,我不知道它的类型。我基本上想实现以下几点: bool someFunction(cv::Mat m){ return m(1,0) != 0; } 我知道这会出错,因为我需要指定类型,如som.at(1,0) 但我不知道是什么类型 我试着做了以下操作:m.at(1,0),但这当然会出错 我想知道什么可能在这里起作用。谢谢 我假设您是针对单通道图像执行此操作,但即使对于>1通道图像,您也会有一个想法 您可以将函数更改为 template<class

所以我试图用行和列的值得到矩阵的值,我不知道它的类型。我基本上想实现以下几点:

bool someFunction(cv::Mat m){
   return m(1,0) != 0;
}
我知道这会出错,因为我需要指定类型,如som.at(1,0) 但我不知道是什么类型

我试着做了以下操作:m.at(1,0),但这当然会出错


我想知道什么可能在这里起作用。谢谢

我假设您是针对单通道图像执行此操作,但即使对于>1通道图像,您也会有一个想法

您可以将函数更改为

template<class T>
bool someFunction(cv::Mat_<T> m) {
   return m(1,0) != 0;
};
模板
布尔函数(cv::Mat_m){
返回m(1,0)!=0;
};
你可以像这样调用函数-

someFunction<uchar>(gray);
someFunction(灰色);
在这里,我假设您从正在调用的函数中知道类型。 您可以使用Mat对象的任何数据类型来代替uchar。
如果您还想自动化此任务,请选择。

一个不太优雅的解决方案。使用和开关盒

#include<cv.h>
#include<stdint.h>

using namespace cv;
using namespace std;

bool someFunction(Mat m) {
    switch (m.depth()){
        case CV_8U:
            return m.at<uint8_t>(1,0) != 0;
        case CV_8S:
            return m.at<int>(1,0) != 0;
        case CV_16U:
            return m.at<uint16_t>(1,0) != 0;
        case CV_16S:
            return m.at<int16_t>(1,0) != 0;
        case CV_32S:
            return m.at<int32_t>(1,0) != 0;
        case CV_32F:
            return m.at<float>(1,0) != 0;
        case CV_64F:
            return m.at<double>(1,0) != 0;
    }
}

int main() {
    Mat m(2,2, CV_8UC1);
    cout << someFunction(m) << endl;
}
#包括
#包括
使用名称空间cv;
使用名称空间std;
布尔函数(Mat m){
开关(m.深度(){
案例CV_8U:
返回m.at(1,0)!=0;
案例CV_8S:
返回m.at(1,0)!=0;
案例CV_16U:
返回m.at(1,0)!=0;
案例CV_16S:
返回m.at(1,0)!=0;
案例CV_32S:
返回m.at(1,0)!=0;
案例CV_32F:
返回m.at(1,0)!=0;
案例CV_64F:
返回m.at(1,0)!=0;
}
}
int main(){
材料m(2,2,CV_8UC1);

如果您不知道元素的类型,您如何知道将元素与数字(0)进行比较是合法/合理的操作?问题特别指出,Mat的类型未知。