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个元素的地址相加,获得所需要的元素的地址。
    所以,以上的方式虽然很容易使用,但是却不是获得矩阵元素的最好方式。特别是当你要顺序遍历整个矩阵中所有元素时,这种每次对地址的重复计算就更加显得不合理。
  • 相关阅读:
    关于BigDecimal转String的准确性问题
    MyBatis动态Sql之if标签的注意事项
    Servlet与通信协议概述
    关于ThreadLocal的那些事
    MyBatis 中 @Param 注解的四种使用场景
    Mybatis中#{}与${}的区别
    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    jsp有哪些动作?作用分别是什么?
    forward 和redirect的区别 ?
    Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?
  • 原文地址:https://www.cnblogs.com/ttzm/p/5419252.html
Copyright © 2011-2022 走看看