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