我有一个问题。我看到了一些类似的问题,但是找不到解决方法。
我的问题是,我有一个CV_32FC3 cv :: Mat,其中值存储在0到255之间的范围内,我们称其为S。
我必须创建一个矩阵,称为P,在其中存储所有像素的BGR值。
因此,P应该具有总元素像素数作为行数,通道数(3)作为列数。
这是我尝试做的事情:
我还尝试了类似这样的低级 C API 数据访问:
同时还分离通道(但分离的通道类型为CV_8U,所以我认为这是错误的):
但是每次我计算像素时都会得到非常奇怪的结果,比如:
在某些情况下也会出现段错误。你能解释一下吗?怎么解决它?为什么我的尝试是错误的?
编辑:我认为问题是数据类型转换。
我的问题是,我有一个CV_32FC3 cv :: Mat,其中值存储在0到255之间的范围内,我们称其为S。
我必须创建一个矩阵,称为P,在其中存储所有像素的BGR值。
因此,P应该具有总元素像素数作为行数,通道数(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
在某些情况下也会出现段错误。你能解释一下吗?怎么解决它?为什么我的尝试是错误的?
编辑:我认为问题是数据类型转换。