【OpenCV 基础知识 10】裁剪图像

发布于:2024-05-22 ⋅ 阅读:(151) ⋅ 点赞:(0)

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.

网站公告

今日签到

点亮在社区的每一天
去签到