zoukankan      html  css  js  c++  java
  • 访问Mat矩阵中的元素并为其赋值

    在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式。今天主要讲容易方式: 
    最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵,不是指针,网上有很多人说是指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素。CV_MAT_ELEM可以给矩阵赋值,也可以访问矩阵元素。

    CV_MAT_ELEM宏实际上会调用CV_MAT_ELEM_PTR(matrix,row,col)宏来完成任务。 CV_MAT_ELEM_PTR()宏的参数是矩阵,行,列。CV_MAT_ELEM()宏和CV_MAT_ELEM_PTR()宏的区别是,在调用CV_MAT_ELEM时,指向矩阵元素的指针的数据类型已经依据输入参数中的元素类型而做了强制转换:

    如下程序:

    CvMat* mat = cvCreateMat(3,3,CV_32FC1);//创建矩阵

    cvZero(mat);//将矩阵置0

    //为矩阵元素赋值
    CV_MAT_ELEM( *mat, float, 0, 0 ) = 1.f;
    CV_MAT_ELEM( *mat, float, 0, 1 ) = 2.f;
    CV_MAT_ELEM( *mat, float, 0, 2 ) = 3.f;
    CV_MAT_ELEM( *mat, float, 1, 0 ) = 4.f;
    CV_MAT_ELEM( *mat, float, 1, 1 ) = 5.f;
    CV_MAT_ELEM( *mat, float, 1, 2 ) = 6.f;
    CV_MAT_ELEM( *mat, float, 2, 0 ) = 7.f;
    CV_MAT_ELEM( *mat, float, 2, 1 ) = 8.f;
    CV_MAT_ELEM( *mat, float, 2, 2 ) = 9.f;

    //获得矩阵元素的值
    float element = CV_MAT_ELEM(*mat,float,2,2);

    float element_1_1 = 7.7f;
    *((float*)CV_MAT_ELEM_PTR(m, 1, 1)) = element_1_1;

    float element = CV_MAT_ELEM(m,float, 1,1 );

    cout<<element<<endl;

    以上使用矩阵中元素的方式很方便,但不幸的是,该宏在每次调用时,都会重新计算指针的位置。这意味着,先查找矩阵数据区中第0个元素的位置,然后,根据参数中的行和列,计算所需要的元素的地址偏移量,然后将地址偏移量与第0个元素的地址相加,获得所需要的元素的地址。
    所以,以上的方式虽然很容易使用,但是却不是获得矩阵元素的最好方式。特别是当你要顺序遍历整个矩阵中所有元素时,这种每次对地址的重复计算就更加显得不合理。
  • 相关阅读:
    IOS中浏览器修改document.title不起作用
    he content must be served over HTTPS 解决方案
    Nuxt开发经验分享
    Nuxt插件-axios封装
    requestAnimationFrame & 定时器
    Vue 组件中data为什么是函数
    js-鸡兔同笼方程
    css技巧-清明追思-网站置灰
    详细分享TortoiseGit配置密钥的方法
    js
  • 原文地址:https://www.cnblogs.com/ttzm/p/5419252.html
Copyright © 2011-2022 走看看