У меня какая-то проблема. Я видел еще несколько похожих вопросов, но не могу найти решение.
Моя проблема в том, что у меня 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 ..
какие-либо разъяснения? как это решить? почему мои испытания не верны?
РЕДАКТИРОВАТЬ: я думаю, что проблемы с преобразованием типов данных