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



我有一种问题。我看到了一些更相似的问题,但我找不到解决办法。

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

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

因此,p的行数应为S像素的总元素数,列数应为通道数(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];
}

但每次我都会得到非常奇怪的结果,如果定制像素,比如:

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 

而且,在某些情况下,也会出现segfault。。

有什么欺骗行为吗?如何解决?为什么我的审判是错误的?

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

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]=;
    }
}

我认为您访问矩阵元素的方式不对。

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];
}

最新更新