当前位置: 首页 > news >正文

OpenCV 图像复制和图像区域读写

图像复制

  • 共享数据, 使用 new Mat(srcMat, ...) 和 newMat=srcMat 生成新的Mat都和原Mat共享数据, 也就是说如果修改某一Mat,其他Mat也会随之改变
  • 复制全新的Mat, 使用CopyTo() 和 Clone() 方法将生成一个全新的Mat, 新Mat和原Mat不共享数据.

图像区域和点的读写

  • 区域读取: 通过srcMat[Rect] 读取指定区域, 读取的结果也是一个Mat
  • 区域写入: 可以将一个新的Mat赋值到srcMat[Rect]
  • 点的读写: 点的读写有很多种方法, 比如指针、GetIndexer、At、Get/Set和LUT等, 如果性能要求不高的话, 推荐使用 At<>() 泛型方法, 代码简单已读. 可参考 https://blog.csdn.net/TyroneKing/article/details/129108838
  • 点的读取: 可以通过 srcMat.At<>() 方法获取指定点的颜色值.
  • 点的写入: 可以直接给 srcMat.At<>()的结果赋值

图像共享数据的测试

private void copyMats(){string pngFile = @"D:\my_workspace\opencv\images\draw.png";var mat = Cv2.ImRead(pngFile, ImreadModes.Color);//通过指定Rect方式截取图像,新的Mat和原Mat共享数据var partRef1 = new Mat(mat, new Rect(0, 0, mat.Width, mat.Height));//通过指定rowRange和colRange方式截图图像,新的Mat和原Mat共享数据var partRef2 = new Mat(mat, rowRange: new Range(50, 300), colRange: Range.All);//CopyTo()和Clone()都是复制出一份新的Matvar deepCopyMat = new Mat();mat.CopyTo(deepCopyMat);var cloneMat = mat.Clone();var rect = new Rect(10, 10, 100, 100);mat[rect] = new Mat(rect.Width, rect.Width, MatType.CV_8UC3, Scalar.Red);Cv2.ImShow("mat", mat);Cv2.ImShow("partRef1", partRef1);Cv2.ImShow("partRef2", partRef2);Cv2.ImShow("deepCopyMat", deepCopyMat);Cv2.ImShow("cloneMat", cloneMat);Cv2.WaitKey();Cv2.DestroyAllWindows();}

效果截图:

读写测试代码

private void readWriteTest(){string pngFile = @"D:\my_workspace\opencv\images\draw.png";var srcMat = Cv2.ImRead(pngFile, ImreadModes.Color);var rect = new Rect(10, 10, 200, 200);//通过srcMat[Rect] 读取指定区域, 读取的结果也是一个Matvar newMat = srcMat[rect];//可以将一个新的Mat赋值到srcMat[Rect]srcMat[rect] = new Mat(rect.Width, rect.Width, MatType.CV_8UC3, Scalar.Green);for (int i = 0; i < srcMat.Rows; i++){//可以通过 srcMat.At() 方法获取指定点的颜色值.var vec3b = srcMat.At<Vec3b>(i, 100);//可以直接给 srcMat.At()的结果赋值srcMat.At<Vec3b>(i, 100) = new Vec3b(vec3b.Item0, 0, 255);}Cv2.ImShow("mat", srcMat);Cv2.ImShow("newMat", newMat);Cv2.WaitKey();Cv2.DestroyAllWindows();}

效果截图:

参考:

  • OpenCV如何扫描图像、利用查找表和计时/遍历、修改Mat像素 https://blog.csdn.net/TyroneKing/article/details/129108838
http://www.lryc.cn/news/224040.html

相关文章:

  • 【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata
  • es6过滤对象里面指定的不要的值filter过滤
  • Docker从入门到上天系列第二篇:传统虚拟机和容器的对比以及Docker的作用以及所解决的问题
  • 共话医疗数据安全,美创科技@2023南湖HIT论坛,11月11日见
  • 乐园要吸引儿童还是家长?万达宝贝王2000万会员的求精之路
  • ps人像怎么做渐隐的效果?
  • 为什么IN操作符一般比OR操作符清单执行更快
  • GPT-4-Turbo的128K长度上下文性能如何?超过73K Tokens的数据支持依然不太好!
  • osg之黑夜背景地月系显示
  • 持续交付-Jenkinsfile 语法
  • IDEA重新choose source
  • 解析虚拟文件系统的调用
  • 佳能相机拍出来的dat文件怎么修复为正常视频
  • OAuth2.0双令牌
  • Django(二、静态文件的配置、链接数据库MySQL)
  • Linux 本地Yearning SQL审核平台远程访问
  • Leetcode—226.翻转二叉树【简单】
  • 【阿里云】任务2-OSS对象存储教程(找我参加活动可获得京东卡奖励)
  • 人工智能模型转ONNX 连接摄像头使用ONNX格式的模型进行推理
  • osgEarth之添加shp
  • Eolink Apikit 版本更新:「数据字典」功能上线、支持 MongoDB 数据库操作、金融行业私有化协议、GitLab 生成 API 文档...
  • GPT-4V:AI在医疗领域的应用
  • OpenCV 在ImShow窗体上选择感兴趣的区域
  • ubuntu 安装redis详细教程
  • qframework 架构 (作者:凉鞋)使用笔记
  • 【JMeter】定时器分类以及场景介绍
  • Spring Boot 请求/actuator/beans 无法访问 返回404
  • AVD联网
  • [Vue warn]: Missing required prop: “action“
  • Python标准库有哪些