Реализация цикла For в открытом резюме?

0

Я хочу реализовать аналогичный цикл в open cv.Этот код выполняется в Matlab. Поскольку я новичок в открытии cv.I не знаю, как продолжить. Может кто-нибудь дать мне идеи сделать это в C++

for m=1:10
 for n=1:20
    for l=1:Ns
       for k=1:Ns
            Y(l,k)=image1(m-Ns+l-1,n-Ns+k-1);
            DD(l,k)=image2(m-Ns+l-1,n-Ns+k-1);               
       end
    end  
  e=Y-DD ;     
 end
end

здесь Image1 и image2 имеют размер 300 * 300 пикселей. Y, DD, image1, image2 al - матовые изображения.

  • 0
    на каком языке программирования? C ++?
  • 0
    Я хочу реализовать в C ++. Я редактировал вопрос :)
Показать ещё 3 комментария
Теги:
opencv

2 ответа

0

Наиболее эффективным способом OpenCV для доступа к пикселям в цикле for является:

cv::Mat rgbImage;
cv::Mat grayImage;
for ( int i = 0; i < rgbImage.rows; ++i )
  {
    const uint8_t* rowRgbI = rgbImage.ptr<uint8_t> ( i );
    const uint8_t* rowGrayI = grayImage.ptr<uint8_t> ( i );
    for ( int j = 0; j < rgbImage.cols; ++j )
      {
        uint8_t redChannel = *rowRgbI++;
        uint8_t greenChannel = *rowRgbI++;
        uint8_t blueChannel = *rowRgbI++;

        uint8_t grayChannel = *rowGrayI++
      }
  }

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

Если вы хотите реализовать скользящее окно, вы можете сделать что-то вроде этого:

cv::Mat img;
int windowWidth = 5;
int windowHeight = 5;
for ( int i = 0; i < img.rows - windowHeight; ++i )
  {
    for ( int j = 0; j < img.cols - winddowWidth; ++j )
      {
        // either this
        cv::Mat currentWindow = img(cv::Range(j, i), cv::Range(j + windowWidth, i + windowHeight));
        // perform some operations on the currentWindow

        // or do this
        getRectSubPix(img, cv::Size(windowWidth, windowHeight), cv::Point2f(j, i), currentWindow));
        // perform some operations on the currentWindow
      }
  }

Вы можете узнать больше о getRectSubPix().

  • 0
    спасибо за ответ. что я намерен сделать так, чтобы мне нужно было увеличить первый 5 * 5 блок с каждого изображения и выполнить операцию. после этого следующие 5 * 5 пикселей и так далее.
0

В OpenCV изображения могут быть представлены как Mat или IplImage. В вашем вопросе не указывается тип изображения.

Если IplImage:

IplImage *img;
unsigned char *image = (unsigned char*)(img->imageData);
int imageStride = img->widthStep;
pixData = image[xCount + yCount*imageStride];

Если Mat:

Mat img;
unsigned char *image = (unsigned char*)(img.data);
int imageStride = img.step;
pixData = image[xCount + yCount*imageStride];

pixData будет содержать эти данные в (xCount, yCount). Вы можете использовать это понимание в цикле for.

Поскольку вы уже знаете логику, я упоминаю только о том, как обращаться к данным из определенной точки изображения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню