假设我有一个名为image的数组,它是一个长的连续“size”元素数组 - 如下所定义。 我想裁剪这个数组(然后得到一个子矩阵)然后,通过修改子数组,我将自动修改源图像(参考)。
请注意,裁剪操作将返回非连续数组。这实际上是问题所在。
有没有办法在C ++中优雅地完成这项工作?
顺便说一句,通过使用OpenCV,boost等,我不感兴趣 ...
感谢您的帮助。
template <class Type> class Image
{
private:
Type *image;
public:
int rows;
int cols;
int size;
Image(int rows, int cols): rows(rows), cols(cols)
{
image = new Type[size = rows*cols];
}
~Image()
{
delete [] image;
}
Type & at(int i, int j)
{
return image[cols*i + j];
}
void print()
{
for(int i = 0; i < rows; ++i)
{
for(int j = 0; j < cols; ++j)
cout << at(i,j) << " ";
cout << endl;
}
cout << endl;
}
};
答案 0 :(得分:3)
你可以创建一个CroppedImage类,它包含一个指向原始Image和偏移的引用或指针,并提供自己的方法,它们添加偏移然后调用原始图像方法:
template <class Type> class CroppedImage
{
private:
Image<Type> *original;
int offsetX;
int offsetY;
public:
int rows;
int cols;
int size;
CroppedImage(Image<Type> *orig, int offX, int offY, int width, int height)
{
original = orig;
offsetX = offX;
offsetY = offY;
rows = height;
cols = width;
size = rows*cols;
}
~CroppedImage(){}
Type & at(int i, int j)
{
return original->at(i+offsetX, j+offsetY);
}
void print()
{
for(int i = 0; i < rows; ++i)
{
for(int j = 0; j < cols; ++j)
cout << at(i,j) << " ";
cout << endl;
}
cout << endl;
}
}
我没有测试过,可能会有一些拼写错误和其他错误。 如果您不想创建新类,可以将代码合并到Image类中。