2014-02-19 2 views
0

Я хочу, чтобы реализовать подобный цикл в открытом коде cv.This делается в Matlab .Как я новичок, чтобы открыть cv.I не знаю, как proceed.Can кто-нибудь дать мне идеи, чтобы сделать это в C++Реализация Для цикла в открытом cv?

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++? – Micka

+0

Я хочу реализовать в C++. Я отредактировал вопрос :) – kadu

+0

Что делают 2 внешние петли? Результаты сохраняются только для m = 20 и n = 20. – user664303

ответ

0

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

Если IplImage:

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

Если Мат:

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

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

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

0

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

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 пикселей и так далее. – kadu

Смежные вопросы