Доступ к указателю пикселя

#pixel

#пиксель

Вопрос:

Можете ли вы объяснить мне, как был выполнен доступ к пикселю в этом двойном цикле? как они изменяют строки, столбцы и значение пикселя?

 for(int i=0;i<cv_ptr->image.rows;i  )
    {   
        float* ptr_img_A = cv_ptr->image.ptr<float>(i); 

        for(int j=0;j<cv_ptr->image.cols;j  )
        {                   
            *ptr_img_B=255*(*ptr_img_A)/3.5;
             ptr_img_A  ;   
        }           
    }
  

Спасибо.

Ответ №1:

Во-первых, является ли это полным кодом или ptr_img_B на самом деле ptr_img_A в первой строке внутреннего цикла?

Во-вторых, я бы рекомендовал называть ваши переменные по содержимому, которое у них есть.

 for(int i=0;i<cv_ptr->image.rows;i  )
{   
    float* row_ptr = cv_ptr->image.ptr<float>(i); 

    for(int j=0;j<cv_ptr->image.cols;j  )
    {                   
        *row_ptr=255*(*row_ptr)/3.5;
         row_ptr  ;   
    }           
}
  

Таким образом, в основном он масштабирует каждый пиксель изображения с коэффициентом 255/3,5

Что касается доступа к пикселю, он хранится в памяти следующим образом

       COL
ROW   1  2  3  4
  1   0  1  2  3
  2   4  5  6  7
  3   8  9 10 11
  4  12 13 14 15
  

Затем, чтобы получить доступ, например, к пикселю в строке 3, столбец 2

 float* row_ptr = cv_ptr->image.ptr<float>(row-1);
float value  = row_ptr[col-1];
  

Наконец, я надеюсь, что вам понравится проводить время с OpenCV, это действительно хороший фреймворк 🙂

Комментарии:

1. ptr_img_A получает информацию из другого изображения, называемого «image», это не полный код.

2. вы приводите пример пикселя 3,2, но я не вижу 2 и 3 в коде!!

3. Извините за это, вместо этого я использовал переменные row и col . Где row = 3 и col = 2