我想在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是mat图像。
答案 0 :(得分: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循环中使用这种理解。
正如您已经了解的逻辑,我只提到如何从图像中的特定点访问数据。
答案 1 :(得分: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()的更多信息。