opencv Mat 使用时的注意事项

PCL 平面点云的凹多边形边界提取【2025最新版】 平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。 阅读详情

下面的small tips 是我在做毕设时处理图片遇到的一些问题,先如今都已经找到了解决的方法,适合于opencv的新手看一看。


1. imread() 小陷阱

imread('img.jpg');

这条语句读进来的是3通道,无论img.jpg是单通道的图像还是3通道的图像,所以输入图像如果是灰度图像,为了不出错,可以使用

imread("img.jpg",-1);

2.normalize() 小陷阱

要注意它的输入矩阵必须是单通道的,具体可见下方红色部分。

<span style="font-size:14px;">
//

//#include "stdafx.h"

#include <iostream>     
#include "opencv2/core/core.hpp"     
#include "opencv2/features2d/features2d.hpp"     
#include "opencv2/highgui/highgui.hpp"     
#include <iostream>  
#include <fstream>
#include <vector>
#include <opencv2/legacy/legacy.hpp>

using namespace cv;    
using namespace std;    
int main()    
{    
      Mat img_1 = imread("lena_color.bmp"); 
	//定义变量
	double min1,min2,min3,max1,max2,max3;
	ofstream Channel1,Channel2,Channel3;
	ofstream Channel1n,Channel2n,Channel3n;

	//<span style="background-color: rgb(255, 102, 102);">打开存储所需要的数据的文本,如果没有,则新建</span>
	Channel1.open("Channel1PixelValue.txt");
	Channel2.open("Channel2PixelValue.txt");
	Channel3.open("Channel3PixelValue.txt");
	Channel1n.open("Channel1PixelValueNormed.txt");
	Channel2n.open("Channel2PixelValueNormed.txt");
	Channel3n.open("Channel3PixelValueNormed.txt");

	vector<Mat> channels;//用来存放三个通道的像素值,channels 有三个元素,每个元素代表一个通道,一个通道一个就是一个Mat

	Mat norm1,norm2,norm3;
	//分离出三个通道并存储
        split(img_1,channels); 
	Channel1<<channels.at(0);
	Channel2<<channels.at(1);
	Channel3<<channels.at(2);

	//找到三个通道里的最大最小值,确定归一化函数的第二个和第三个参数
	minMaxIdx(channels.at(0), &min1, &max1);
	minMaxIdx(channels.at(1), &min2, &max2);
	minMaxIdx(channels.at(2), &min3, &max3);

	//<span style="background-color: rgb(255, 102, 102);">如果要用normalize函数得到0和1之间的小数像素值,输入矩阵不能是int类型,这里转换为float类型已经足够</span>
	Mat_<float> temp1,temp2,temp3;
    channels.at(0).convertTo(temp1, CV_32F);
    channels.at(1).convertTo(temp2, CV_32F);
    channels.at(2).convertTo(temp3, CV_32F);
	
	//归一化三个通道的值
	normalize(temp1,norm1,1.0,0.0,CV_MINMAX);
	normalize(temp2,norm2,1.0,0.0,CV_MINMAX);
	normalize(temp3,norm3,1.0,0.0,CV_MINMAX);

	//储存归一化后的三个通道的值
	Channel1n<<norm1;
	Channel2n<<norm2;
	Channel3n<<norm3;
	
	//以图像的形式存储起来三个通道的值
        imwrite("channel1.jpg",channels.at(0));
	imwrite("channel2.jpg",channels.at(1));
	imwrite("channel3.jpg",channels.at(2));
	//////
	//////
    ORB orb;    
    vector<KeyPoint> keyPoints_1;
    Mat descriptors_1;
    orb(img_1, Mat(), keyPoints_1, descriptors_1);    
    
    // 获得当前的坐标
	cv::Mat output;
	cv::drawKeypoints(img_1,keyPoints_1,output);
	cv::imshow("imgpath",output); 
	waitKey(0);
        return 0;
}   </span>
3.Mat.at() 小陷阱

在今天我对于一个Mat src 进行at(0,0)取像素值操作,src.at(0,0)这样写是错误的。应该要写成src.at<double>(0,0).

由于我对泛型理解太浅所以出现了这种错误。


以后遇到再补充好啦!


cesium 深度图(获取区域最高最低点位) 文章摘要: Cesium深度图技术可用于获取区域地形高程数据,核心实现步骤包括:1)通过离屏相机构建独立渲染环境,使用正交投影确保采样精度;2)采用离屏渲染技术获取均匀分布的地形点数据。关键技术点包含多边形外包矩形计算、后台相机配置(5km高度正交投影)、1024×1024像素离屏视图设置,以及深度数据解析(RGBA格式转换和三维坐标还原)。该方法避免了主视图干扰,可精准获取区域内地形高程信息,为填挖方分析等应用提供基础数据支持。 阅读详情

相关推荐

SAP成本控制范围配置全流程:从货币参数到标准层次(附2024最新SPRO路径)

本文详细拆解了SAP成本控制范围(Controlling Area)的完整配置流程,涵盖从货币与估价参数文件定义、参数文件分配到控制范围,再到成本中心标准层次创建等核心步骤。文章提供了2024年最新的SPRO导航路径和实战配置要点,帮助顾问构建稳健、可扩展的管理会计基础架构,并附有常见问题排查指南。

java5的博客 938

OpenCV(c++) 矩阵 Mat 类的用法与注意事项

Mat类 基本介绍 Mat类是OpenCV中使用最频繁的类之一,用于储存矩阵数据及相关操作,也是程序中图像的主要形式。 Mat类主要由两部分组成:一个描述头(matrix header)及一个指向矩阵数据的指针。其中,描述头包含了矩阵的一些基本信息,如矩阵的尺寸,所占空间大小等。 Mat类有以下几个特点: Mat类会自动分配内存,使用者无需考虑内存的管理。(老版的OpenCV中使用IPIImage类,需要用户自己管理内存) Mat类使用了引用计数系统(Reference Counting System),

qq_42374559的博客 2556

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

OpenCV 中 cv::Mat 类的使用

OpenCV的Mat类可以表示一个N维的数组,数组的每个位置可以是单通道或多通道。可以用来存储图片(灰度或彩色)、向量、直方图等很多东西。

henry_23的博客 9690

Buck的振铃实验与分析

上上期我们提到了buck电路的开关的振铃波形,本质原因是LC的阻尼振荡。文章偏理论,那BUCK到底是怎么产生尖峰振荡呢? 要想把这个问题搞清楚,也很是不容易,所以文章有点长,请直接点赞转发加收藏。 问题 本期主要分析以下这两个问题: 1、死区时间是什么?这里有个小台阶是什么情况? 2、上下尖峰振荡是如何产生的?跟哪些因素有关? 理想的BUCK的SW波形 我们由浅入深,一步一步来,先看理想的开关SW波形—没有尖峰电压的波形。 为了能更好的看buck电路各个点的电压电流情况.

weixin_42005993的博客 3万+

手把手用ROS实现Ego-Planner动态避障:无人机撞树问题终结方案

本文详细介绍了如何在ROS和Gazebo仿真环境中,通过配置和调优Ego-Planner算法,实现无人机的动态避障功能。文章深入解析了其基于局部梯度优化的核心思想,提供了从环境搭建、参数详解到代码集成的完整实践指南,并分享了实战排错经验,旨在彻底解决无人机在复杂动态场景中的碰撞问题。

weixin_29031161的博客 1624

opencv 中Mat与vector使用时注意事项

1. 在使用vector保存opencv的Mat数据时,遇到一个深拷贝和浅拷贝的问题: Mat tmp = Mat::zeros(.....) int iter; vector matBuffer; for(iter = 0; iter < TotalCnt; ++iter) {  matBuffer.push_back(tmp); // 此时matbuffer中存储的是相同的Mat

hit1524468的专栏 4505

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码)

本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。

ujm5678901的博客 689

【OpenCV】有关内存释放的一些问题

转载请注明出处:http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7586847 前一天把系统整个重写了一遍,脉络清晰了很多,也终于解决了以前很多崩溃,异常退出的问题。这里小小总结一下自己遇到的麻烦。 1、内存泄露 内存泄露是说没有释放已经不能使用的内存,这里一般指堆的内存才需要显示的释放。比如用malloc,calloc,real

引力空间 3173

腾讯面试——机器学习岗面试总结

先写合并两个有序数组,接着写合并n个有序的数组,假设总共m个数,讲了一个思路两两合并直到只剩下一个数组,分析一下时间复杂度(MlogN),面试官不满意,然后想了一下说了另一个思路,用n个指针开始指向各个数组的首端,用一个优先队列维护他们的最小值,每次拿出最小值的指针然后插入该指针的下一个值。感觉跟二面面试官聊得还是挺开心的,他详细地介绍了他们部门所做的业务,然后问了一下什么时候能来实现,我说只能暑假七八两个月,他觉得有点晚,这样子不利于转正,有些人都实习半年的,回去讨论一下,正式批之前给我答复。

FPGA/MATLAB学习教程/源码/项目合作开发 1229

光学测量仿真软件:Zygo_(12).Zygo软件的用户界面与操作指南

Zygo软件支持用户自定义工具和插件,以扩展软件的功能和适应特定的仿真需求。编写脚本使用Python或其他支持的脚本语言编写自定义工具的脚本。例如,编写一个脚本来计算光束的衍射效率。# 示例脚本:计算光束的衍射效率 import zygo # 导入Zygo软件的API def calculate_diffraction_efficiency(wavelength , grating_period , angle) : """计算光束的衍射效率:param wavelength: 光源波长(单位:米)

kkchenjj的博客 1664

Opencv之Mat操作(重要)

1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的。OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。 矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等。 矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样

walkingMa的专栏 1万+

IEC104协议学习专栏内容规划

IEC104协议的编程学习

sixtome 1109

OpenCV Mat创建矩阵体时易错点(create、zeros方法注意事项)

首先明白一点,cv::Mat是一个矩阵图像类,它的确有两部分组成: 1)矩阵头:包含矩阵的尺寸、存储方法、存储地址等信息和一个指向存储图像中所有像素的矩阵体 2)矩阵体 在一次项目中,我预先声明了一个Mat对象,此时只创建了图像矩阵的信息头部分,并没有创建矩阵体! 后来在要申请矩阵实体的内存时,遇到了两个问题 问题一 使用create创建矩阵实体 使用create方法来创建矩阵实体时,无法对实体中...

benobug的博客 3185

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

opencv c++ Mat CUDA的编译与使用

双击 C:\Users\admin\Documents\Visual Studio 2015\Projects\opencv-4.6.0-vc14_vc15\opencv\build\OpenCV.sln。下载需要注册,我用qq邮箱注册了一个账号,才下载下来。注:直接选中额外模块的源代码是无法编译的。新增的是关于contribute模块的。还有直接建议复制源码过去的。最后generate。

ResumeProject的博客 2045

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OpenCV固定矩阵类Matx、矩阵类Mat初始化方法汇总

1,Matx初始化方法 1.1用数组初始化 double vals[4] = {1,2,3,4}; Matx22d m(vals); 2,Mat初始化方法 2.1直接赋值初始化 Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0); 或者用数组形式: int a[3][3] = { 0, -1, 0,-1, 5, -1, 0, -1, 0}; Mat C(2,3,CV_32S,a); //type不..

aquapisces的博客 3643

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

opencv中Mat和数组赋值的几种方法

用opencv还不太熟练时,经常会在一些小地方出错,特别是Mat的赋值。现在总结一下我用到的几种方法。 Mat a = (Mat_(2,2)<<1,2,3,4); float b[4]={5,6,7,8}; Mat c = Mat(2,2,CV_32F,b).clone(); memcpy(a.data,b,sizeof(float)*4); memcpy(b,a.data,sizeof(flo

wearevolunteer的专栏 2万+

OpenCV入门系列 —— cv::Mat简单使用

cv::Mat为模板类,如果是在上下游分离的两个串行流程中使用同一份cv::Mat对象数据时,需注意元素数据类型一致及默认初始化内容; 常用作图像处理中的mask遮罩、深度图(depth)存储容器;

工业机器视觉 1383

OpenCV编程注意事项

OpenCV编程注意事项 1、图片格式 OpenCV读取彩色图是是BGR格式,可以通过以下函数来转换: #python img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) //c++ cvtColor(rgb_img, bgr_img, CV_BGR2RGB); 2、坐标系 OpenCV中图像的左上角为坐标系的原点,这种坐标系在结构体Mat,Rect,Point...

qq_26667429的博客 365

查看opencv的mat数据类型及相互转换

查看opencv的mat数据类型及相互转换

知识搬运工的博客 9169

mat opencv 修改roi_OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat)...

OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat)我正在尝试将我的图像的一部分切割(裁剪)到另一个,因此它可以单独处理。 我找到了轮廓,现在试图在新Mat中保存每个轮廓,但它给出了错误Mat crop;Imgproc.findContours(m, contours, new Mat() ,Im...

weixin_39534978的博客 333

OpenCV常见的注意事项(持续更新中)

OpenCV常见注意事项总结:保存cv::Mat原始数据到文本中便于对比;copyTo与convertTo在使用中遇到的陷阱问题

一步一脚印 553

opencv Mat 显示不同数据类型图像

单通道float类型Mat在存数据时需要归一化, 即图像数据需要归一化到0~1之间。这是float类型图片的灰度空间。 比如: Mat a=Mat::zeros(200,200,CV_32FC1); for(int row=0;row!=a.rows;row++) for(int col=0;col!=a.cols;col++) {...

weixin_30698297的博客 166

android jni mat,OpenCV Mat处理Android JNI

我目前正在开发一些使用OpenCv的Android API和JNI进行更快处理的东西。OpenCV Mat处理Android JNI目前,该程序从设备相机获取一帧,并将RGBA-Matrix转发给JNI接口的C++算法。这通常工作,但试图以任何方式处理基质的时候,我得到一个SIGABRT -6错误与以下跟踪:D/JNI/LaneDetection(15547): Processing frameD...

weixin_39701834的博客 342

【OpenCV】Mat详解

OpenCV中的cv::Mat是核心数据结构,用于存储图像和矩阵数据,具有自动内存管理和高效操作的特点。其结构分为矩阵头(存储元信息如尺寸、数据类型)和数据指针(指向实际像素数据),通过引用计数实现内存管理。创建方式包括构造函数、特殊矩阵初始化、外部数据包装及图像读取。访问像素数据可使用at<T>()、行指针或迭代器。常用操作包括通道处理、ROI提取和图像保存。使用时需注意数据类型匹配、浅拷贝与深拷贝的区别,以及BGR通道顺序。

Ray Home 1859

004-Mat对象详解

目录一、Mat对象1、构成2、常用成员及含义1、data2、dims3、channels4、depth3、常用构造方法1、Mat::Mat()2、Mat::Mat(int rows, int cols, int type)3、Mat::Mat(Size size, int type)4、Mat::Mat(int rows, int cols, int type, const Scalar& s)5、Mat::Mat(Size size, int type, const Scalar& s)6

qq_38253797的博客 1466
上一篇: c++实现大批量图片的均值消减均方差化1操作
下一篇: 导出大批量图片的名字到txt文件的一种笨但有效的方法
PParis
博客等级 码龄13年 20粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值