opencv обращается к элементу цвета CV_32FC3 BGR cv :: Mat - PullRequest
1 голос
/ 21 марта 2012

У меня какая-то проблема. Я видел еще несколько похожих вопросов, но не могу найти решение.

Моя проблема в том, что у меня 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 ..

какие-либо разъяснения? как это решить? почему мои испытания не верны?

РЕДАКТИРОВАТЬ: я думаю, что проблемы с преобразованием типов данных

Ответы [ 2 ]

0 голосов
/ 29 ноября 2012
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]=;
    }
}
0 голосов
/ 22 марта 2012

Я думаю, что вы обращаетесь к своим элементам матрицы неверным образом.

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