【发布时间】:2012-03-21 19:19:54
【问题描述】:
我有一个问题。我见过一些更类似的问题,但我找不到解决方案。
我的问题是我有一个 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
而且,在某些情况下还有段错误..
有什么解释吗?如何解决?为什么我的试验是错误的?
编辑:我认为问题在于数据类型转换
【问题讨论】: