Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 访问矩阵中行、列的值_Opencv_Matrix - Fatal编程技术网

Opencv 访问矩阵中行、列的值

Opencv 访问矩阵中行、列的值,opencv,matrix,Opencv,Matrix,我试图访问矩阵中的特定行,但很难做到这一点 我想得到第j行第I列的值,但我认为我的算法不正确。我将OpenCV的Mat用于我的矩阵,并通过数据成员访问它 以下是我尝试访问值的方式: 平面数据[i+j*平面行] 其中i=列,j=行。这是正确的吗?该矩阵是YUV矩阵的1个平面 任何帮助都将不胜感激!谢谢。我认为访问RGB Mat和YUV Mat没有什么不同。只是颜色空间不同而已 请参阅有关如何访问每个像素的信息。否,您的错误 数据[i+j*plane.rows]不是访问像素的好方法。指针必须取决于矩

我试图访问矩阵中的特定行,但很难做到这一点

我想得到第j行第I列的值,但我认为我的算法不正确。我将OpenCV的Mat用于我的矩阵,并通过数据成员访问它

以下是我尝试访问值的方式:

平面数据[i+j*平面行]

其中i=列,j=行。这是正确的吗?该矩阵是YUV矩阵的1个平面


任何帮助都将不胜感激!谢谢。

我认为访问RGB Mat和YUV Mat没有什么不同。只是颜色空间不同而已

请参阅有关如何访问每个像素的信息。

否,您的错误 数据[i+j*plane.rows]不是访问像素的好方法。指针必须取决于矩阵的类型及其深度。 应该使用矩阵的at()运算符

为了简单起见,这里有一个代码示例,它访问矩阵的每个像素并打印它。它几乎适用于每种矩阵类型和任意数量的通道:

void printMat(const Mat& M){
    switch ( (M.dataend-M.datastart) / (M.cols*M.rows*M.channels())){

    case sizeof(char):
         printMatTemplate<unsigned char>(M,true);
         break;
    case sizeof(float):
         printMatTemplate<float>(M,false);
         break;
    case sizeof(double):
         printMatTemplate<double>(M,false);
         break;
    }
}


template <typename T>  
void printMatTemplate(const Mat& M, bool isInt = true){
    if (M.empty()){
       printf("Empty Matrix\n");
       return;
    }
    if ((M.elemSize()/M.channels()) != sizeof(T)){
       printf("Wrong matrix type. Cannot print\n");
       return;
    }
    int cols = M.cols;
    int rows = M.rows;
    int chan = M.channels();

    char printf_fmt[20];
    if (isInt)
       sprintf_s(printf_fmt,"%%d,");
    else
       sprintf_s(printf_fmt,"%%0.5g,");

    if (chan > 1){
        // Print multi channel array
        for (int i = 0; i < rows; i++){
            for (int j = 0; j < cols; j++){         
                printf("(");
                const T* Pix = &M.at<T>(i,j);
                for (int c = 0; c < chan; c++){
                   printf(printf_fmt,Pix[c]);
                }
                printf(")");
            }
            printf("\n");
        }
        printf("-----------------\n");          
    }
    else {
        // Single channel
        for (int i = 0; i < rows; i++){
            const T* Mi = M.ptr<T>(i);
            for (int j = 0; j < cols; j++){
               printf(printf_fmt,Mi[j]);
            }
            printf("\n");
        }
        printf("\n");
    }
}
void打印材料(常数材料和材料){
开关((M.dataend-M.datastart)/(M.cols*M.rows*M.channels()){
案例大小(字符):
printMatTemplate(M,true);
打破
案例大小(浮动):
printMatTemplate(M,false);
打破
箱子尺寸(双):
printMatTemplate(M,false);
打破
}
}
模板
void printMatTemplate(常量Mat&M,bool isInt=true){
if(M.empty()){
printf(“空矩阵\n”);
返回;
}
如果((M.elemSize()/M.channels())!=sizeof(T)){
printf(“错误的矩阵类型。无法打印\n”);
返回;
}
int cols=M.cols;
int行=M行;
int chan=M.channels();
char printfu fmt[20];
如果(isInt)
sprintf_s(打印fmt,%%d,);
其他的
sprintf_s(打印fmt,%%0.5g,);
如果(chan>1){
//打印多通道阵列
对于(int i=0;i