Я хочу реализовать аналогичный цикл в 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 - матовые изображения.
Наиболее эффективным способом 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().
В 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.
Поскольку вы уже знаете логику, я упоминаю только о том, как обращаться к данным из определенной точки изображения.