cvGetSubRect()与cvGetColumns()或cvGetRows()非常类似,区别在于cvGetSubRect()通过参数rect在数组中选择一个任意的子矩阵。与其他选择数组子区域的函数一样,submat仅仅是一个被cvGetSubRect()函数填充的头,它将指向用户期望的子矩阵数据,这里不涉及内存分配和数据的复制。
program cv_GetSubRect;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ocv.highgui_c,
ocv.core_c,
ocv.core.types_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
uResourcePaths;
const
filename = cResourceMedia + 'opencv_logo_with_text.png';
var
image: pIplImage = nil;
cut_image: pIplImage = nil;
R: TCvRect;
begin
try
// 加载图像,CV_LOAD_IMAGE_UNCHANGED 表示加载图像时不进行任何更改或转换
image := cvLoadImage(filename, CV_LOAD_IMAGE_UNCHANGED);
// 创建矩形区域 R,左上角坐标为 (50, 50),宽度和高度均为 250
R := CvRect(50, 50, 250, 250);
// 创建一个与 image 具有相同深度和通道数的图像 cut_image
cut_image := cvCreateImage(CvSize(0, 0), image^.depth, image^.nChannels);
// 从 image 中提取矩形区域 R,并将结果保存到 cut_image 中
cut_image := pIplImage(cvGetSubRect(image, cut_image, R));
// 创建两个窗口用于显示原始图像和裁剪后的图像
cvNamedWindow(filename, CV_WINDOW_AUTOSIZE);
cvNamedWindow('Cut image', CV_WINDOW_AUTOSIZE);
// 在原始图像上绘制一个矩形框,以突出裁剪的区域
cvRectangle(image, CvPoint(50, 50), CvPoint(50 + 250, 50 + 250), CvScalar(150));
// 在窗口中显示原始图像和裁剪后的图像
cvShowImage(filename, image);
cvShowImage('Cut image', cut_image);
// 等待按键输入,直到用户按下任意键
cvWaitKey(0);
// 释放内存,释放原始图像和裁剪后的图像
cvReleaseImage(image);
cvReleaseImage(cut_image);
// 销毁所有窗口
cvDestroyAllWindows;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.