Mat类型是新版本opencv中最常用的也是很方便计算的图像类型。下面介绍几种访问Mat类型图像元素的方法:
方法一:
for( int i=0;i<row;i++ ) { for( int j=0;j<col;j++ ) { Vec3i bgr = srcimg.at<Vec3b>(i,j); //用Vec3b也行 Vec3i luv = dstimg.at<Vec3b>(i,j); for (int k=0;k<3;k++) { rgbchannels[k].pixels.push_back(bgr.val[k]); luvchannels[k].pixels.push_back(luv.val[k]); } } }
方法二:
for( int i=0;i<row;i++ ) { for( int j=0;j<col;j++ ) { //[row, col]像素的第 1 通道地址被 * 解析(blue通道) luvchannels[0].pixels.push_back(*(dstimg.data + dstimg.step[0] * row + dstimg.step[1] * col)) ; //[row, col]像素的第 2 通道地址被 * 解析(green通道), 关于elemSize1函数的更多描述请见 Fn1 里所列的博文链接 luvchannels[1].pixels.push_back(*(dstimg.data + dstimg.step[0] * row + dstimg.step[1] * col + dstimg.elemSize1())); //[row, col]像素的第 3 通道地址被 * 解析(red通道) luvchannels[2].pixels.push_back(*(dstimg.data + dstimg.step[0] * row + dstimg.step[1] * col + dstimg.elemSize1() * 2)); } }方法三:
for( int i=0;i<row;i++ ) { for( int j=0;j<col;j++ ) { luvchannels[0].pixels.push_back(*(dstimg.ptr(i)+j*dstimg.channels()+0)) ; luvchannels[1].pixels.push_back(*(dstimg.ptr(i)+j*dstimg.channels()+1)) ; luvchannels[2].pixels.push_back(*(dstimg.ptr(i)+j*dstimg.channels()+2)) ; } }
public: class channel { public: vector<double> pixels; public: channel() { pixels.clear(); } ~channel(){}; };
public: channel luvchannels[3]; channel rgbchannels[3];第二种方法运行时报错,暂时不知道不知道为什么。前两种亲测可用。