以下是我从信誉良好的来源获得的代码,但它不起作用:
Mat img = imread("/home/w/d1",CV_LOAD_IMAGE_COLOR);
unsigned char *input = (unsigned char*)(img.data);
int i,j,r,g,b;
for(int i = 0;i < img.rows ;i++){
for(int j = 0;j < img.cols ;j++){
b = input[img.step * j + i ] ;
g = input[img.step * j + i + 1];
r = input[img.step * j + i + 2];
cout << b << g <<r;
}
}
当我运行它时,输出与我做cout时的输出不同&lt;&lt; IMG; 我认为它可能与新的C ++接口有关。如果是这样,我应该使用step1方法,有人可以告诉我如何使用step1方法更新我的代码以访问BGR值。我找不到在线文档。关于如何使用step1。提前感谢您的帮助。
答案 0 :(得分:1)
也许你想避免使用'原始数据'方法:
for(int i=0; i<img.rows; i++) {
for(int j=0; j<img.cols; j++) {
Vec3b pix = img.at<Vec3b>(i,j);
cout << int(pix[0]) << int(pix[1]) << int(pix[2]) << endl;
}
}
答案 1 :(得分:1)
你的代码看起来基本正确,但据我所知,你的订单是错误的。 您必须访问
value = data[img.step*ROW + COL]
但你有行和col切换。
编辑:此外,您需要将COL乘以通道数:
value = data[img.step*ROW + #channels*COL + currentChannel]
尝试:
Mat img = imread("/home/w/d1",CV_LOAD_IMAGE_COLOR);
unsigned char *input = (unsigned char*)(img.data);
int i,j,r,g,b;
for(int i = 0;i < img.rows ;i++){
for(int j = 0;j < img.cols ;j++){
b = input[img.step * i + 3*j ] ; // 3 == img.channels()
g = input[img.step * i + 3*j + 1];
r = input[img.step * i + 3*j + 2];
cout << b << g <<r;
}
}