我对使用多个频道感到困惑。 以下哪一项是正确的?
// roi is the image matrix
for(int i = 0; i < roi.rows; i++)
{
for(int j = 0; j < roi.cols; j+=roi.channels())
{
int b = roi.at<cv::Vec3b>(i,j)[0];
int g = roi.at<cv::Vec3b>(i,j)[1];
int r = roi.at<cv::Vec3b>(i,j)[2];
cout << r << " " << g << " " << b << endl ;
}
}
或者,
for(int i = 0; i < roi.rows; i++)
{
for(int j = 0; j < roi.cols; j++)
{
int b = roi.at<cv::Vec3b>(i,j)[0];
int g = roi.at<cv::Vec3b>(i,j)[1];
int r = roi.at<cv::Vec3b>(i,j)[2];
cout << r << " " << g << " " << b << endl ;
}
}
答案 0 :(得分:2)
第二个是正确的, Mat内的行和列表示像素数, 而通道与行和列号无关。 和CV默认使用BGR,所以假设Mat没有转换为RGB,那么代码是正确的
参考,个人经历,OpenCV docs
答案 1 :(得分:1)
从图像中获取颜色分量的一种更快捷的方法是将图像表示为IplImage
结构,然后使用像素大小和通道数来使用指针算法迭代它。
例如,如果您知道图像是3通道图像,每个像素1个字节且格式为BGR(OpenCV中的默认值),则以下代码将可以访问其组件:
(在以下代码中,img
的类型为IplImage
。)
for (int y = 0; y < img->height; y++) {
for(int x = 0; x < img->width; x++) {
uchar *blue = ((uchar*)(img->imageData + img->widthStep*y))[x*3];
uchar *green = ((uchar*)(img->imageData + img->widthStep*y))[x*3+1];
uchar *red = ((uchar*)(img->imageData + img->widthStep*y))[x*3+2];
}
}
要获得更灵活的方法,您可以使用CV_IMAGE_ELEM
中定义的types_c.h
宏:
/* get reference to pixel at (col,row),
for multi-channel images (col) should be multiplied by number of channels */
#define CV_IMAGE_ELEM( image, elemtype, row, col ) \
(((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
答案 2 :(得分:0)
我猜第二个是正确的,然而获取这样的数据是非常耗时的。
更快的方法是使用IplImage *数据结构并增加指向roi中包含的数据大小的地址...