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

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.
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-Nolan

请我喝杯咖啡吧,鼓励一下创作!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值