OpenCV学习——多通道矩阵的赋值和取值

本文通过一个具体的示例展示了如何使用OpenCV创建一个3x3的浮点型多通道矩阵,并对其进行初始化及打印操作。文章详细介绍了如何利用CvMat结构体进行内存分配、清零、赋值和读取矩阵元素的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#pragma comment( lib, "cxcore.lib" )
#include "cv.h"
#include <stdio.h>
void main()
{
//矩阵元素为三通道浮点数
CvMat* mat = cvCreateMat(3,3,CV_32FC3);
cvZero(mat);//将矩阵置0
//为矩阵元素赋值

//获得矩阵元素(0,0)的指针
float *p = (float*)cvPtr2D(mat, 0, 0);
//为矩阵赋值
for(int i = 0; i < 9; i++)
{
//为每个通道赋值
*p = (float)i*10;
p++;
*p = (float)i*10+1;
p++;
*p = (float)i*10+2;
p++;
}

//打印矩阵的值
p = (float*)cvPtr2D(mat, 0, 0);

for(i = 0; i < 9; i++)
{
printf("%2.1f,%2.1f,%2.1f\t",*p,*(p+1),*(p+2));
p+=3;
if((i+1) % 3 == 0)
printf("\n");
}
}

<think>好的,用户让我整理一份OpenCV API接口解析文档。我需要先考虑用户的需求是什么。可能他们正在学习OpenCV,或者在做项目时需要快速查阅常用函数的详细信息。之前的对话中,用户询问了cv::warpAffine,现在可能希望有一个更全面的文档,涵盖更多常用函数。 首先,我要确定用户可能需要的API范围。OpenCV非常庞大,不可能覆盖所有函数,所以需要挑选最核心常用的部分。比如图像读写、颜色转换、几何变换、滤波、特征检测等。用户之前问的是图像处理相关的函数,所以应该集中在这些模块。 接下来,每个API的解析结构应该一致,方便用户查阅。参考之前对warpAffine的回答,结构包括函数功能、原型、参数详解、示例等。需要保持类似的格式,但可能需要更简洁一些,因为这次是整理多个API,不能每个都像之前那么详细,否则文档会太长。 另外,用户可能需要对比不同函数的区别,比如warpAffinewarpPerspective,或者不同插值方法的效果。所以在适当的地方加入对比表格会有帮助。 还要注意数学公式的使用,用户可能对背后的原理感兴趣,比如几何变换的矩阵运算。但需要保持平衡,避免过于深入数学细节,影响文档的实用性。 考虑到用户可能是开发者,示例代码的实用性很重要。每个API最好提供一个简单的代码示例,展示基本用法,比如读取图像、处理、保存结果。同时,参数说明要清晰,特别是常用参数的可能取值影响。 另外,需要检查是否有常见的注意事项,比如内存管理、参数顺序、数据类型要求等。这些对正确使用API很关键,避免用户踩坑。 可能还需要考虑文档的结构,比如分章节,按功能模块组织API,这样用户查找起来更方便。比如分为图像读写、图像处理、几何变换、特征检测等部分。 最后,要确保使用中文,并且术语准确。比如正确翻译OpenCV中的概念,保持一致性。例如,“插值方法”要对应正确的英文术语,并在括号中注明,如INTER_LINEAR。 现在,开始整理各个模块的API。首先从图像读写开始,imreadimwrite是基础。然后是颜色空间转换cvtColor,接着是几何变换的resize、warpAffine、warpPerspective。滤波部分包括GaussianBlur、medianBlur。特征检测比如Canny边缘检测,HoughLines直线检测。形态学操作如erode、dilate。轮廓处理findContours,绘图函数rectangle、putText等。 每个API的结构大致保持:功能、函数原型、参数说明、示例代码、注意事项。需要确保参数说明准确,比如参数的数据类型、默认值、可选值等。示例代码要简短,但完整,能够直接运行测试。 同时,对比不同函数,比如resize中的插值方法与warpAffine中的有何异同,是否需要特别说明。另外,注意函数之间的依赖关系,比如getRotationMatrix2D生成仿射矩阵,然后传给warpAffine使用,这需要在示例中体现。 最后,添加常见问题或注意事项部分,总结使用这些API时容易出错的地方,比如图像数据类型不符导致的错误,或者参数顺序的问题,帮助用户避免常见错误。 整个过程需要系统化,确保覆盖主要API,结构清晰,信息准确,示例实用,同时保持文档的简洁易读性。这样用户才能快速找到所需信息,并正确应用到项目中。</think>以下是根据OpenCV 4.x版本整理的API接口解析文档(核心模块精选): --- # **OpenCV核心API解析** --- ## **1. 图像读写** ### **cv::imread** ```cpp Mat cv::imread( const String& filename, int flags = IMREAD_COLOR ); ``` **功能**:读取图像文件 **参数**: - `filename`:文件路径(支持jpg/png/bmp等格式) - `flags`: - `IMREAD_COLOR`:3通道BGR格式(默认) - `IMREAD_GRAYSCALE`:单通道灰度图 - `IMREAD_UNCHANGED`:保留Alpha通道 **注意**:路径错误时返回空Mat对象 --- ### **cv::imwrite** ```cpp bool cv::imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>() ); ``` **功能**:保存图像到文件 **参数**: - `params`:编码参数(如JPG质量:`{IMWRITE_JPEG_QUALITY, 95}`) --- ## **2. 图像处理基础** ### **cv::cvtColor** ```cpp void cv::cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ); ``` **常用色彩空间转换**: | code | 转换方向 | |-----------------------|---------------------| | COLOR_BGR2GRAY | BGR → 灰度 | | COLOR_BGR2HSV | BGR → HSV | | COLOR_HSV2BGR | HSV → BGR | | COLOR_BGR2RGB | BGR ↔ RGB通道交换 | --- ## **3. 几何变换** ### **cv::resize** ```cpp void cv::resize( InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation = INTER_LINEAR ); ``` **缩放策略**: - `dsize``fx/fy`同时非零时,优先使用`dsize` - `interpolation`:同`warpAffine`的插值方法 --- ### **cv::warpPerspective** ```cpp void cv::warpPerspective( InputArray src, OutputArray dst, InputArray M, // 3x3变换矩阵 Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar() ); ``` **特性**:实现投影变换(单应性变换) --- ## **4. 图像滤波** ### **cv::GaussianBlur** ```cpp void cv::GaussianBlur( InputArray src, OutputArray dst, Size ksize, // 核尺寸(必须为正奇数) double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT ); ``` **作用**:高斯模糊,常用于去噪 **技巧**:当`sigmaX=0`时,自动根据`ksize`计算σ值 --- ### **cv::medianBlur** ```cpp void cv::medianBlur( InputArray src, OutputArray dst, int ksize // 核大小(必须为≥3的奇数) ); ``` **特点**:中值滤波,有效去除椒盐噪声 --- ## **5. 特征检测** ### **cv::Canny** ```cpp void cv::Canny( InputArray image, OutputArray edges, double threshold1, // 低阈值 double threshold2, // 高阈值 int apertureSize=3, bool L2gradient=false ); ``` **边缘检测流程**: 1. 计算梯度幅值方向 2. 非极大值抑制 3. 双阈值滞后处理 --- ### **cv::HoughLines** ```cpp void cv::HoughLines( InputArray image, // 二值图像 OutputArray lines, double rho, // 距离分辨率(像素) double theta, // 角度分辨率(弧度) int threshold, // 投票阈值 double srn=0, // 多尺度Hough变换参数 double stn=0 ); ``` **输出**:$N \times 1$ 的Vec2f数组,每个元素为$(\rho, \theta)$ --- ## **6. 形态学操作** ### **cv::erode / cv::dilate** ```cpp void cv::erode( InputArray src, OutputArray dst, InputArray kernel, // 结构元素 Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() ); ``` **常用结构元素**: ```cpp Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3)); ``` --- ## **7. 轮廓处理** ### **cv::findContours** ```cpp void cv::findContours( InputArray image, // 二值图像 OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point() ); ``` **模式选择**: | mode | 说明 | |----------------------|-----------------------------| | RETR_EXTERNAL | 只检测最外层轮廓 | | RETR_LIST | 检测所有轮廓(无层级关系) | | RETR_TREE | 检测所有轮廓(树状层级) | --- ## **8. 绘图函数** ### **cv::rectangle** ```cpp void cv::rectangle( InputOutputArray img, Point pt1, // 矩形左上角 Point pt2, // 矩形右下角 const Scalar& color, int thickness=1, int lineType=LINE_8, int shift=0 ); ``` **快捷用法**:`cv::Rect`对象可直接作为参数传递 --- ### **cv::putText** ```cpp void cv::putText( InputOutputArray img, const String& text, Point org, // 文字左下角坐标 int fontFace, // 字体类型(如FONT_HERSHEY_SIMPLEX) double fontScale, // 字体缩放因子 Scalar color, int thickness=1, int lineType=LINE_8, bool bottomLeftOrigin=false ); ``` --- ## **9. 矩阵操作** ### **cv::Mat::convertTo** ```cpp void Mat::convertTo( OutputArray m, int rtype, // 目标数据类型 double alpha=1, double beta=0 ) const; ``` **公式**:$m(x,y) = saturate_cast<rtype>(alpha \times (*this)(x,y) + beta)$ --- ## **API使用黄金准则** 1. **内存管理**:OpenCV对象自动管理内存,避免手动释放 2. **Mat数据共享**:赋值操作共享数据,需用`.clone()`深拷贝 3. **ROI操作**:使用`Mat roi = src(Rect(x,y,w,h))`提取感兴趣区域 4. **类型匹配**:注意`CV_8UC3`与`CV_32F`等类型差异 5. **多通道处理**:使用`cv::split``cv::merge`处理各通道 --- ## **常用工具函数速查** | 函数 | 作用 | |-----------------------|----------------------------| | cv::waitKey(delay) | 显示图像时的键盘事件处理 | | cv::norm(src1, src2) | 计算矩阵/向量的范数 | | cv::minMaxLoc(src) | 查找矩阵中最小/最大值及其位置| | cv::flip(src, dst, 0) | 图像翻转(0=垂直, 1=水平) | --- **注**:实际开发中应结合官方文档([docs.opencv.org](https://docs.opencv.org/))模块示例代码使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值