OpenCV —— 矩阵操作

多通道的矩阵 —— 通道是连续的!!

要将指向该数据类型的指针移动到下一通道,我们只需要将其增加1。如果想访问下一个“像素”或者元素集,则需要一定的偏移量

矩阵的step元素是矩阵中行的长度,单位为字节。

 

#include "cv.h"
#include "highgui.h"
#include <IOSTREAM.H>

int main(int argc,char** argv)
{
    float vals[]={0.85,-0.46,0.36,1.33};

    // 逐点赋值式
//     CvMat* mat=cvCreateMat(2,2,CV_32FC1);
//     cvZero(mat);
//     cvmSet(mat,0,0,1);
//     cvmSet( mat, 0, 1, 2 );        // 用于处理浮点型单通道矩阵 等同于 cvSetReal2D(mat,0,1,2)
//     cvmSet( mat, 1, 0, 3 );
//     cvmSet( mat, 2, 2, 4 );

    // 连接现有数组
    CvMat mat=cvMat(2,2,CV_32FC1,vals);
    // 不需要cvReleaseMat,因为数据内存分配是由double定义的数组进行的。 

    cout<<cvGetElemType(&mat)<<endl;    // 存储在数组中的元素类型
    cout<<cvGetDimSize(&mat,1)<<endl;    // 矩阵在那个维数上的大小

    unsigned e1=CV_MAT_ELEM(mat,float,1,0);    // 简单方法 CV_MAT_ELEM()
    float *e2=(float *)CV_MAT_ELEM_PTR(mat,2,2);    // 这些宏在每次调用的时候都重新计算指针

    //cvReleaseMat(&mat);
    cout<<e1<<endl;
    return 0;
}

float sum(const CvMat* mat)
{
    // 累加一个三通道矩阵中的所有元素

    float s=0.0f;
    for(int row=0;row<mat->rows;row++)
    {
        const float* ptr=(const float*)(mat->data.ptr+row*mat->step);    // 行数据元素使用字节计算的
        for(int col=0;col<mat->cols;col++)
            s+=*ptr++;
    }
    return s;
}

void saturate_sv(IplImage* img)
{
    for(int y=0;y<img->height;y++)
    {
        uchar* ptr=(uchar*)(img->imageData+y*img->widthStep);
            // 当要处理的是矩阵时,必须对偏移进行调整 —— 因为数据指针可能是非字节类型

        for(int x=0;x<img->width;x++)
        {
            ptr[3*x+1]=255;
            ptr[3*x+3]=255;
        }
    }
}

OpenCV —— 矩阵操作,布布扣,bubuko.com

时间: 2024-12-26 18:09:42

OpenCV —— 矩阵操作的相关文章

Opencv矩阵操作

分配矩阵空间: CvMat* cvCreateMat(int rows, int cols, int type); 释放矩阵空间: cvReleaseMat(&M); 数据类型宏定义: CV_<bit_depth>(S|U|F)C<number_of_channels> 复制矩阵: CvMat* M2;    M2=cvCloneMat(M1); 初始化矩阵: double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 要

OpenCV &mdash;&mdash; 矩阵和图像操作

cvAbs , cvAbsDiff , cvAbsDiffS cvAdd , cvAddS , cvAddWeighted(可添加权重) #include <cv.h> #include <highgui.h> int main(int argc,char** argv) { IplImage *s1,*s2; s1=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_COLOR); s2=cvLoadImage("test.

[opencv]像素操作的数字图像处理

之前几天捣鼓matlab,用来处理数字图像,矩阵操作什么的,如果忘记线性代数就真的GG了. 在用了matlab被深深地吐槽之后,决定改用opencv,C++貌似也是处理数字图像的很好的工具 1. 在ubuntu上安装opencv 教程可以百度之,都很详细的 2. 像素处理图像: (1)根据输入的数据,用邻近取样插值法,缩放图像 邻近取样插值法原理:http://blog.chinaunix.net/uid-27675161-id-3452025.html   (2)根据输入,改变数字图像的灰度分

OpenCV—基本矩阵操作与示例

OpenCV的基本矩阵操作与示例 OpenCV中的矩阵操作非常重要,本文总结了矩阵的创建.初始化以及基本矩阵操作,给出了示例代码,主要内容包括: 创建与初始化 矩阵加减法 矩阵乘法 矩阵转置 矩阵求逆 矩阵非零元素个数 矩阵均值与标准差 矩阵全局极值及位置 其他矩阵运算函数列表 1. 创建矩阵 1.1 数据类型 建立矩阵必须要指定矩阵存储的数据类型,图像处理中常用的几种数据类型如下: CV_8UC1// 8位无符号单通道 CV_8UC3// 8位无符号3通道 CV_8UC4 CV_32FC1//

iOS开发UI篇—Quartz2D使用(矩阵操作)

iOS开发UI篇-Quartz2D使用(矩阵操作) 一.关于矩阵操作 1.画一个四边形 通过设置两个端点(长和宽)来完成一个四边形的绘制. 代码: 1 - (void)drawRect:(CGRect)rect 2 { 3 //画四边形 4 //获取图形上下文 5 CGContextRef ctx=UIGraphicsGetCurrentContext(); 6 //绘图 7 CGContextAddRect(ctx, CGRectMake(20, 50, 100, 100)); 8 //渲染

poj3735—Training little cats(特殊操作转化为矩阵操作)

题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2. e i 让第i只猫咪吃光它的花生 3. s i j 交换猫咪i与猫咪j的花生 现将上述一组连续操作做m次后,求每只猫咪有多少颗花生? 思路:这道题难点在如何把这种奇怪的操作转化为矩阵操作,网络上看到一个画的很好的图,这里直接偷过来. 现在,对于每一个操作我们都可以得到一个转置矩阵,把k个操作的矩

matlab矩阵操作

1:求行数  nrow=size(matrix,1); 2:求列数  ncol=size(matrix,2); 3:矩阵合并 c1=[m1,m2]横向合并  c2=[m1;m2]纵向合并 m1= [5     2     3] ; m2=[1     2     3]; c1 =[5     2     3     1     2     3]; c2 =[ 5 2 3 1 2 3 ] matlab的下标从1开始,取matlab的元素直接用m[index]即可 取子矩阵 m[r1:rn,:]  

避免使用循环的几个高效matlab矩阵操作

matlab拥有强大的晕针运算能力,下面的几个例子展示了很多在其他语言中需要用循环遍历才能完成的操作在matlab里可以用矩阵操作来完成 1)将矩阵中小于零的元素置零: a = [1,2,3;-1,-2,-3;1,0,-1] a(a<0) = 0 打印结果: a = 1 2 3 -1 -2 -3 1 0 -1 a = 1 2 3 0 0 0 1 0 0 2)将矩阵a中小于0的元素乘以2,其他元素不改变值: a = [1,2,3;-1,-2,-3;1,0,-1] a(find(a<0)) = a

图形上下文的矩阵操作(平移-缩放-旋转)

图形上下文的矩阵操作(旋转.缩放和平移) CGContextRotateCTM:图形上下文旋转,以上下文的原点(左上角)为基准 CGContextScaleCTM:图形上下文的缩放,以上下文的原点(左上角)为基准 CGContextTranslateCTM:图形上下文的平移,以上下文的原(左上角)点为基准 注意:一定要在添加路径之前进行设置 下面贴出swift版代码: 1 override func draw(_ rect: CGRect) { 2 let context = UIGraphic