OpenCV4(3)-图像对象拷贝与创建(C++,Python,JS)

OpenCV安装配置与计算机视觉实战指南 计算机视觉作为人工智能的重要分支,通过OpenCV等工具库实现图像处理与分析。OpenCV作为开源计算机视觉库,其核心原理基于数字图像处理算法,支持从基础滤波到深度学习推理的全流程功能。在工程实践中,合理的环境配置与模块选择直接影响性能表现,特别是在涉及DNN模块和CUDA加速的场景下。本文以车牌识别系统为例,展示如何通过色彩空间转换、形态学处理等经典CV技术构建完整处理管线,同时分享多平台部署和性能优化的实战经验。 阅读详情

目录

环境

知识点

C++代码

Python代码

JS代码

返回总目录


环境

  • Python:3.6.5 OpenCV 4.1.2
  • C++:OpenCV 4.1.2
  • JS:OpenCV 4.5.0

环境搭建可参考:B站视频

欢迎访问博主搭建的 在线运行平台 (o゜▽゜)o☆

知识点

1、图像对象的拷贝

学过C++的应该都很清楚,拷贝分为深拷贝和浅拷贝

OpenCV的clone()和copyTo是深拷贝,赋值运算符‘=’是浅拷贝

头部保存了该图像的宽度和高度还有通道数等信息,数据部分保存了该图像的像素信息

2、图像对象的创建

常用方法有Mat::zeros()和Mat::ones()

C++代码

#ifndef DAY03
#define DAY03

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void day03() {

	Mat src = imread("E:\\_Image\\OpenCVTest\\girl.jpg");

	if (src.empty()) {
		cout << "could not load image.." << endl;
		return;
	}

	// 创建方法-克隆
	Mat m1 = src.clone();

	// 复制
	Mat m2;
	src.copyTo(m2);

	// 赋值法
	Mat m3 = src;

	// 创建空白图像
	Mat m4 = Mat::zeros(src.size(), src.type());
	Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);
	Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);

	waitKey(0);
}

#endif // !DAY03

Python代码

import cv2 as cv
import numpy as np

# 查看版本
print(cv.__version__)

# 读取图像
src = cv.imread("E:/_Image/OpenCVTest/girl.jpg")

# 深拷贝 克隆图像
m1 = np.copy(src)

# 浅拷贝 赋值
m2 = src

# 修改 src,m2 也会跟着变
src[100:200, 200:300, :] = 255

# 显示
cv.imshow("src", src)
cv.imshow("m1", m1)
cv.imshow("m2", m2)

# 创建图像对象
m3 = np.zeros(src.shape, src.dtype)
cv.imshow("m3", m3)

m4 = np.zeros([512, 512], np.uint8)
m4[:, :] = 127
cv.imshow("m4", m4)

m5 = np.ones(shape=[512, 512, 3], dtype=np.uint8)
m5[:, :, 0] = 255
cv.imshow("m5", m5)

# 等待键盘输入
cv.waitKey()

# 释放内存
cv.destroyAllWindows()

JS代码

data() {
  return {
    num2type: {
      1: 'CV_8SC1',
      9: 'CV_8SC2',
      17: 'CV_8SC3',
      25: 'CV_8SC4',
      0: 'CV_8UC1',
      8: 'CV_8UC2',
      16: 'CV_8UC3',
      24: 'CV_8UC4',
      3: 'CV_16SC1',
      11: 'CV_16SC2',
      19: 'CV_16SC3',
      27: 'CV_16SC4',
      2: 'CV_16UC1',
      10: 'CV_16UC2',
      18: 'CV_16UC3',
      26: 'CV_16UC4',
      5: 'CV_32FC1',
      13: 'CV_32FC2',
      21: 'CV_32FC3',
      29: 'CV_32FC4',
      4: 'CV_32SC1',
      12: 'CV_32SC2',
      20: 'CV_32SC3',
      28: 'CV_32SC4',
      6: 'CV_64FC1',
      14: 'CV_64FC2',
      22: 'CV_64FC3',
      30: 'CV_64FC4'
    }
  }
},
methods: {
  onOpenCvReady() {
    if (!this.value) {
      this.$message.error('请选择一种创建类型')
      return
    }

    // 官方文档链接:https://docs.opencv.org/4.5.0/de/d06/tutorial_js_basic_ops.html
    const cv = window.cv

    // 读取图像
    const src = cv.imread('imageSrcRaw')

    // 拷贝 克隆 创建图像
    let dst = null
    switch (this.value) {
      case 1:
        dst = src.clone()
        break
      case 2:
        dst = new cv.Mat()
        src.copyTo(dst)
        break
      case 3:
        dst = new cv.Mat()
        break
      case 4:
        dst = new cv.Mat(512, 512, cv.CV_8UC4)
        break
      case 5:
        dst = new cv.Mat(512, 512, cv.CV_8UC4, [255, 0, 0, 127])
        break
      case 6:
        dst = cv.Mat.zeros(512, 512, cv.CV_8UC4)
        break
      case 7:
        dst = cv.Mat.ones(512, 512, cv.CV_8UC4)
        break
      case 8:
        dst = cv.Mat.eye(512, 512, cv.CV_8UC4)
        break
    }

    // 显示图像
    if (dst) cv.imshow('canvasOutput', dst)

    // 销毁所有 mat 释放内存
    src.delete()
    if (dst) dst.delete()
  },
  showImgInfo() {
    const img = window.cv.imread('imageSrcRaw')
    let content = ''
    content += 'img type: ' + this.num2type[img.type()] + ' '
    content += 'img cols: ' + img.cols + ' '
    content += 'img rows: ' + img.rows + ' '
    content += 'img depth: ' + img.depth() + ' '
    content += 'img channels: ' + img.channels() + ' '
    this.$alert(content, '图像属性', {
      confirmButtonText: '确定'
    })
  }
}

官方文档链接:https://docs.opencv.org/4.5.0/de/d06/tutorial_js_basic_ops.html

返回总目录

OpenCV4学习笔记 - 目录

如果这篇文章对您有帮助,欢迎给我的 github项目 点一个⭐ ο(=•ω<=)ρ⌒☆

手把手教你用V4L2驱动树莓派摄像头:从设备树配置到图像采集实战 本文详细介绍了如何使用V4L2驱动树莓派摄像头,从设备树配置到图像采集的完整实战流程。涵盖硬件连接、Linux系统环境搭建、V4L2工具链使用以及C语言图像采集程序开发,帮助开发者快速掌握嵌入式视觉项目开发技巧。 阅读详情

相关推荐

VC++图像处理开发实战:从环境搭建到算法优化与多线程应用

图像处理作为计算机视觉的基础,其核心在于对像素数据的数学运算与空间变换。从原理上讲,它通过卷积、滤波、形态学等算法,实现对图像的增强、分割与特征提取。在工程实践中,选择高效、可控的开发工具至关重要,尤其是在对性能有严苛要求的工业视觉、医疗影像等场景。VC++凭借其与Windows系统的深度集成、对硬件资源的直接掌控能力,成为实现高性能实时图像处理的硬核选择。结合OpenCV等成熟库,开发者可以高效实现从基础的图像读写、卷积滤波,到复杂的轮廓分析、多线程并行处理。本文以VC++为核心,详细解析了开发环境搭建、

circularr9834的博客 378

opencv中,clone(),=,以及copyTo()函数的异同

“=” 图像的赋值操作,是浅拷贝,当源图像改变时,也随之改变。 clone()函数,跟进opencv源码,clone()调用了copyTo()函数。 inline Mat Mat::clone() const { Mat m; copyTo(m); return m; } copyTo()函数有两个接口,第一个接口就是上述clone()调用的接口,所以cop...

weixin_38994090的博客 4043

AI工程实战:六种编程语言在真实项目中的分工与选型

AI开发不是选择‘最好’的编程语言,而是为数据清洗、模型训练、服务部署、边缘推理、跨系统集成等不同工程阶段匹配最合适的工具。Python凭借生态耦合性成为算法原型与数据管道主力;C++以内存可控性和零拷贝能力支撑高并发低延迟推理;JavaScript依托TensorFlow.js实现浏览器端实时AI交互;Julia在蒙特卡洛模拟、微分方程求解等数值密集场景展现并行优势;Java通过JVM稳定性与企业级运维能力完成AI模块与核心系统的合规集成;R则在医药、金融等强监管领域提供统计可复现性保障。理解这种‘阶段驱

weixin_33978044的博客 423

c++和opencv小知识:setTo()和copyTo()/clone()

setTo()和copyTo()详解 一些小函数的运用可以知道代码实现目标更加快捷简单 一、setTo()函数 opencv的setTo函数是将图像设置为某个值; 例如: 1、有一个Mat src,想将他的值全部设置成0,则可以src.setTo(0) 2、setTo还有更为高级的用法,对于一个已知的src,我们要将其中大于或者小于某个值的像素值设置为指定的值,则 可以如下:src.setTo(0...

qq_43702097的博客 4199

Python + WebSocket 视频推流:OpenCV 4.8 实现 50ms 低延迟网页监控(附完整代码)

本文详细介绍了如何使用Python和WebSocket技术结合OpenCV 4.8实现50ms低延迟的视频推流系统。通过优化视频采集、编码参数和WebSocket服务,系统实现了高效的网页监控解决方案,适用于实时监控等场景。

weixin_33721427的博客 315

构建帧处理专用播放器:从FFmpeg/OpenCV技术选型到Python实战

视频处理是计算机视觉和多媒体技术的核心领域,其原理涉及对连续图像序列(帧)的编码、解码与像素级操作。在实时图像处理(Real-Time Image Processing)和信号与视频处理(Signal, Image and Video Processing)等场景中,通用播放器因面向流畅观看设计,往往难以满足精确的帧级控制与数据访问需求。这催生了面向开发者的专用工具需求,其技术价值在于实现对视频流每一帧的精准导航、原始数据提取及自定义处理流水线集成。通过FFmpeg、OpenCV等技术栈,开发者可以构建具备

weixin_34342905的博客 348

【opencv4】opencv教程 C++ 4、Mat对象(深拷贝:clone()、copyTo(),create()创建图片,zeros()、eye()初始化空白图像,Scalar()创建向量)

上一讲:【opencv4】opencv视频教程 C++(opencv教程)3、矩阵的掩膜操作(filter2D) [opencv_C++] 入门强推!!!【B站最全】 文章目录Mat对象Mat对象与IplImage对象Mat对象构造函数与常用方法Mat对象使用(浅复制与深复制)Mat对象使用-四个要点Mat对象创建定义小数组演示代码 Mat对象 Mat对象与IplImage对象 Mat对象构造函数与常用方法 Mat对象使用(浅复制与深复制) Mat对象使用-四个要点 Mat对象创建 定义小数组

Dontla的博客 2463

RK3588 Jupyter中OpenCV实时预览与目标检测调试实战

在边缘计算和嵌入式AI开发中,实时视频处理与可视化是算法调试和性能验证的关键环节。其核心原理在于将图像处理库(如OpenCV)处理的帧数据,高效转换为能在Web浏览器中显示的格式,并通过交互式编程环境实现低延迟反馈。这项技术的工程价值在于极大缩短了“编码-运行-观察”的迭代周期,使开发者能即时调整参数并观察模型输出变化,显著提升开发效率。典型的应用场景包括在资源受限的边缘设备(如RK3588)上进行目标检测模型的调优、算法原型验证以及交互式教学演示。本文聚焦于利用Jupyter Notebook和ipywi

weixin_34174105的博客 363

常用的Opencv函数汇总(持续更新...)

cv.read()、cv.imwrite() 作用:读取/写入图片(注意:读取的通道为BGR) 使用: #读取图片 img_path = "img.jpg" img = cv.imread(img_path) #BGR #写入图片 cv.imwrite("img.png", img) 注,在读取操作时,PIL的Image.open函数读取的通道为RGB,速度比cv.read快。 cv...

weixin_42028608的博客 5787

极验4代滑块验证码逆向分析:从JS混淆到轨迹加密的完整破解

在Web安全与自动化测试领域,人机验证是保护网站免受恶意爬虫和自动化脚本攻击的关键防线。其核心原理在于通过前端JavaScript采集用户交互行为(如鼠标轨迹、点击序列),并利用加密算法生成唯一指纹,提交至服务器进行真实性校验。这项技术的工程价值在于平衡用户体验与安全防护,广泛应用于登录、注册、防刷等关键业务场景。其中,滑块验证码因其直观的交互方式成为主流方案之一。本文聚焦于极验(GeeTest)第四代滑块验证码的逆向工程,深入剖析其JS混淆与轨迹加密机制。通过动态调试定位关键加密函数,结合静态分析还原w参

benben 470

Unity集成JavaCV:实现高性能计算机视觉的终极架构与实战

计算机视觉(CV)作为人工智能的核心分支,旨在让机器“看懂”世界,其核心原理是通过算法处理和分析图像或视频数据,提取有价值的信息。这项技术在游戏开发、增强现实(AR)和人机交互等领域具有极高的技术价值,能够实现手势识别、面部检测、环境理解等智能交互。在Unity游戏引擎中集成CV能力,传统方案常面临性能瓶颈和功能限制。本文聚焦于通过JavaCV这一关键技术,为Unity提供一套高性能、跨平台的终极集成方案。该方案深入剖析了内嵌JVM架构、零拷贝数据传递等核心原理,解决了图像数据在C#与Java间高效流转、跨

weixin_33690367的博客 360

OpenCV4(16)-图像ROI与ROI操作(C++,Python,JS)

知识点: ROI解释: 图像的 ROI(region of interest) 是指图像中感兴趣区域、在 OpenCV 中图像设置图像 ROI 区域,实现只对 ROI 区域的操作。 提取不规则ROI区域的一般步骤: 1、通过inRange函数生成mask 2、通过与操作提取ROI #ifndef DAY16 #define DAY16 #include <opencv2...

Apple_Coco的博客 9935

【opencv-c++】图像对象的赋值,拷贝和创建

opencv里面CV_8UC1简单来说,就是8 bit 的unsigned char无符号的char类型的单通道矩阵。在对Mat对象进行赋值操作的时候,即相当于被内存指针重新指向原来的数据,赋值操作的还是原来的DataBlock。头部对应header,包含图像的属性,比如大小,列宽,行高,类型,通道数等信息。如果为4,则表示带Alpha通道的BGRA彩色图像,即4通道图像。第3部分: 即代表所储存的图像的通道数,常见的有单通道,3通道。拷贝又叫克隆、复制。如果为3,则表示BGR彩色图像,即3通道图像。

jn10010537的博客 1459

OpenCV4学习笔记 - 目录

前言 OpenCV4 学习笔记,实践于 C++、Python 和 JS(Vue)代码 以下文章均收录在我的 GitHub 中,欢迎 Star ⭐ ο(=•ω<=)ρ⌒☆ 环境 Python:3.6.5 OpenCV 4.1.2 C++:OpenCV 4.1.2 JS:OpenCV 4.5.0 环境搭建可参考:B站视频 目录 入门 OpenCV4(1)-读取和显示图像(C++,Python,JS) OpenCV4(2)-保存图像与色彩空间的转换(C++,Python,JS) OpenCV4(3)-图像对

Apple_Coco的博客 1006

OpenCV+MySQL+QT构建工业级本地考勤系统

人脸识别考勤系统本质是图像识别、结构化数据管理与跨平台人机交互的工程集成。其核心在于将人脸特征转化为可审计的业务数据,而非单纯算法精度比拼。OpenCV提供轻量可控的LBPH识别引擎,免训练、易调试,适配边缘硬件;MySQL通过事务控制、行级锁与存储过程保障考勤数据的一致性与可追溯性;QT以原生C++实现Windows/Linux/ARM三端统一部署,规避Web依赖与环境兼容风险。该技术栈特别适用于中小制造企业降本增效、计算机专业毕业设计落地及AI项目从Demo走向产线的实际需求。

weixin_34099526的博客 316

stm32开发3D打印机(一)——介绍(已完成)

如何运用stm32开发3D打印机

Nico_jion的博客 1万+

实时图像处理系统架构与GPU加速优化实践

实时图像处理系统是现代精密测量领域的核心技术,其性能直接影响测量结果的准确性和时效性。这类系统通常采用分层架构设计,通过模块化实现高内聚低耦合,核心组件包括图像采集、实时处理管道和API接口层。在硬件加速方面,GPU计算已成为提升性能的关键手段,特别是CUDA架构的并行计算能力可显著加速FFT等复杂运算。本文以pyRasCal系统为例,详细解析了工业级CMOS传感器集成、双缓冲机制实现零拷贝内存访问,以及通过256线程块配置优化CUDA核心利用率等工程实践。这些技术在工业检测、科研仪器等领域具有广泛应用价值

掬水月在手,弄花香满衣 398

【数据分享】1985-2023年30米CLCD土地覆盖栅格数据分享

总的来说,CLCD 反映了中国快速的城市化进程和一系列生态工程,揭示了气候变化条件下人为对 LC的影响,其在全球变化研究中具有潜在应用价值。最后,通过目视解译的独立样本和第三方测试样本评估CLCD的准确性。特别地,该研究将CLCD产品与目前最先进的30m专题产品包括不透水表面积(ISA)、地表水和森林进行比对,以综合评估CLCD的质量(以下为技术流程图)。数据分类:分为九类用地,该数据包括9种用地类型,分别为:农田、森林、灌木、草原、水域、冰雪、裸地、不透水面、湿地。数据格式:.tif格式。

weixin_61129400的博客 6925

树莓派嵌入式视觉小车实战:从OpenCV算法到PID控制全解析

计算机视觉是让机器感知和理解环境的关键技术,其核心原理在于通过图像处理与模式识别从像素数据中提取有意义的信息。在嵌入式系统领域,这项技术的价值尤为突出,它使得资源受限的设备也能具备实时环境感知与决策能力,广泛应用于智能小车、机器人导航和工业自动化等场景。本文聚焦于基于树莓派和OpenCV的嵌入式视觉方案,深入探讨了在资源受限平台上实现实时图像处理、特征提取(如巡线中线计算)与控制决策(如PID算法)的工程实践,为开发智能巡线避障小车提供了从硬件选型、算法优化到系统调试的完整路径。

weixin_34194359的博客 349

解决PubMed卡在“正在检查浏览器”页面的完整排查指南

DNS解析是将域名转换为IP地址的基础网络服务,其稳定性和准确性直接影响网站访问。当DNS服务器响应缓慢或返回异常结果时,可能导致客户端与服务器建立连接时出现偏差,从而触发网站的安全验证机制,例如Cloudflare等安全服务提供的浏览器环境检查。这一机制旨在防御恶意流量,但偶尔也会误拦截正常访问。在生物医学信息检索领域,PubMed作为核心文献数据库,其稳定访问对科研工作流至关重要。针对因DNS或本地缓存问题导致的‘正在检查浏览器’页面卡顿,通过刷新DNS缓存、更换为Google Public DNS或C

weixin_29597551的博客 3689

基于Simulink的异步电机参数在线辨识与自适应控制仿真

本文基于Simulink平台,详细介绍了异步电机参数在线辨识与自适应控制系统的仿真实现。针对异步电机运行中参数时变问题,采用模型参考自适应系统(MRAS)实时辨识转子电阻和互感,并结合自适应PI控制策略动态调整控制器参数。通过搭建完整的矢量控制(FOC)仿真模型,验证了系统在稳态辨识、参数摄动和动态响应等工况下的性能:参数辨识误差<1.2%,转速跟踪误差<20rpm,动态响应时间<10ms。文章还提供了详细的Simulink建模步骤、核心代码实现及性能分析,为高级电机控制系统的设计与优化提

amy_mhd的博客 73

Jetson Nano CSI/USB 摄像头性能对比:OpenCV 4.1.1 下延迟与帧率实测

本文深入评测了Jetson Nano上CSI与USB摄像头在OpenCV 4.1.1环境下的性能差异,包括帧率、延迟和系统资源占用等关键指标。通过实测数据揭示CSI摄像头在低延迟和高帧率方面的优势,同时提供USB摄像头的优化方案和选型指南,帮助开发者根据项目需求做出明智选择。

fanjava 355

构建自己的 Qt 插件系统

Qt 本身提供了插件相关的技术,但并没有提供一个通用的插件框架!倘若要开发一个较大的 GUI 应用程序,并希望使其可扩展,那么拥有这样一个插件框架无疑会带来很大的好处。

青春不老,奋斗不止! 2万+
上一篇: OpenCV4(2)-保存图像与色彩空间的转换(C++,Python,JS)
下一篇: OpenCV4(4)-图像像素读写操作(C++,Python,JS)
Apple_Coco
博客等级 码龄9年 325粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Apple_Coco

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值