opencv访问CV_32FC3 BGR cv :: Mat的颜色元素

时间:2012-03-21 19:19:54

标签: c++ opencv iterator rgb

我有一个问题。我已经看到了一些更类似的问题,但我找不到解决方案。

我的问题是我有一个CV_32FC3 cv :: Mat,其值存储在0到255之间,我们称之为S.

我必须创建一个名为P的矩阵,其中存储所有像素的BGR值。

所以P应该是行数,S像素的总元素,cols数是通道数(3)。

这是我试图做的事情:

int n_pixels = S.cols * S.rows;
p = Mat::zeros(n_pixels, 3, CV_32FC1);

for(int i=0; i<n_pixels; i++) {
    Scalar pixel = S.at<Scalar>(i); // i've tried also Vec3f, Point3_, etc..

    p.at<float>(i,0) = pixel[0];
    p.at<float>(i,1) = pixel[1];
    p.at<float>(i,2) = pixel[2];
}

我也尝试过这样的低级别c-api数据访问:

for(int i=0; i<selection.rows; i++) {
    p.at<float>(i,0) = S.ptr<float>(i)[0];
    p.at<float>(i,1) = S.ptr<float>(i)[1];
    p.at<float>(i,2) = S.ptr<float>(i)[2];

}

并且还拆分频道(但是分割频道的类型为CV_8U所以我认为这是错误的):

vector<Mat> bgr;
cv::split(S, bgr);

for(int i=0; i<n_pixels; i++) {
    p.at<float>(i,0) = bgr[0].data[i];
    p.at<float>(i,1) = bgr[1].data[i];
    p.at<float>(i,2) = bgr[2].data[i];
}

但每次我得到非常奇怪的结果如果像coutting像素,如:

172.2042 0.0000 0.0000 
2771.1414 0.0000 0.0000 
2939505920.0000 3.3468 0.0000 
3079446986752.0000 0.0129 0.0000 
192669347217408.0000 0.8367 0.0000 
51956177323392237568.0000 16301891256320.0000 0.0509 
58314208864123224064.0000 3.3945 0.0029 
180449.1406 0.0000 0.0000 
0.6531 0.0000 0.0000 
0.0100 0.0000 0.0000 
2.7373 0.0000 0.0000 
10957.3184 0.0000 0.0000 
739729604608.0000 3.3778 0.0000 
0.0000 0.0000 0.0000 
0.0000 0.0000 0.0000 
0.0000 0.0000 0.0000 
0.0000 0.0000 0.0000 

并且,在某些情况下还会出现段错误。

任何解释?怎么解决?为什么我的试验错了?

编辑:我认为问题是数据类型转换

2 个答案:

答案 0 :(得分:0)

我认为你正在以错误的方式访问你的矩阵元素。

S.at<Scalar>(i);

相同
S.at<Scalar>(Point(i,0));

但您需要提供xy坐标。

对我来说,这段代码给出了预期的结果:

for(int i=0; i<n_pixels; i++) 
{
    Vec3f pixel = S.at<Vec3f>(i/S.cols, i%S.cols);

    p.at<float>(i,0) = pixel[0];
    p.at<float>(i,1) = pixel[1];
    p.at<float>(i,2) = pixel[2];
}

答案 1 :(得分:0)

for(int row = 0; row < resiz.rows; ++row) {
    float* p = resiz.ptr<float>(row);

    for(int col = 0; col < resiz.cols; ++col,p+=3) {
        p[0]=; p[1]=; p[2]=;
    }
}