zoukankan      html  css  js  c++  java
  • opencv中CV_IMAGE_ELEM的用法读取每个像素

    可以使用OpenCV定义的宏来提取象素值
    假设灰度图像image,存取其i行j列的象素可以这样:CV_IMAGE_ELEM(image, uchar,y, x)
    如果是彩色图像就是
    CV_IMAGE_ELEM(image, uchar,y, 3*x)
    CV_IMAGE_ELEM(image, uchar,y, 3*x+1)
    CV_IMAGE_ELEM(image, uchar,y, 3*x+2)

    CV_IMAGE_ELEM是一个宏,

    #define CV_IMAGE_ELEM( image, elemtype, row, col )
    (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])

    #define CV_MAT_ELEM( mat, elemtype, row, col )
    (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

    呵呵,我一直把它当一个函数用,其实本质也没有什么区别的

    但要想正确的得到图像的坐标为(x,y)点的像素值,是应该这样写CV_IMAGE_ELEM(Image, uchar, y, x)

    要注意像素点的坐标xy和行列值的顺序是相反的(可以仔细思考为什么)

    我刚开始一直写成CV_IMAGE_ELEM(Image, uchar, x, y),结果有时候就造成了访问image越界,从而报错,花了好长时间才捣鼓出来,

    不过将IMAGE的数据按照原来的样子复制到mat中可以这么写:
    CV_IMAGE_ELEM(pImage, uchar, i, j) = CV_MAT_ELEM(*mat, uchar, i, j)

    不用改变顺序

    总之,当应用这个宏是如果老报错,就试试换个顺序,或者检查访问的地址是否越界

  • 相关阅读:
    南邮OJA题
    Executors工厂类创建线程池的底层实现
    Linux kernel 中的per_cpu宏
    [置顶] 高并发服务器的设计内存池的设计
    数据列表DataList模板之实例
    软件开发无敌心得篇
    嵌入式学习笔记之UART通信协议
    正则表达式 进阶(二)
    11687 Digits
    DELPHI接口转化为COM接口
  • 原文地址:https://www.cnblogs.com/Peit/p/6428943.html
Copyright © 2011-2022 走看看