我的问题是我有一个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
并且,在某些情况下还会出现段错误。
任何解释?怎么解决?为什么我的试验错了?
编辑:我认为问题是数据类型转换
答案 0 :(得分:0)
我认为你正在以错误的方式访问你的矩阵元素。
S.at<Scalar>(i);
与
相同S.at<Scalar>(Point(i,0));
但您需要提供x
和y
坐标。
对我来说,这段代码给出了预期的结果:
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]=;
}
}