分享

关于Opencv的矩阵和图像(cvSetRealND)

 清风明月0391 2014-03-01
最近在用MFC+OPENCV写课程实验的时候,发现用cvSetReal2D对已经创建了的矩阵元素赋值,总会导致程序异常。已经创建的矩阵即用cvCreateMat函数设置成单通道的浮点型。开始以为是由于我指定矩阵元素index是浮点型的缘故,可是无论是强制转成int型还是直接给定一个整形常数例如cvSetReal2D(arr, 100, 100,0),依然会有程序异常中止。
由于在创建了这个矩阵之后,我在这个矩阵上用过opencv的绘图函数,画过cvLine,所以干脆试了下不指定index下矩阵元素的值,而是直接在index下用cvCircle画实心圆,结果成功了。
然后我想了很久,猜想也许这和之前使用过cvSet或者cvLine函数有关,因为用这些函数的时候,是cvScalar数据类型,而再次指定矩阵元素值的时候,cvSetReal2D用的却是double类型,这也解释了为什么用cvCircle函数不会发生异常,因为cvCircle画的颜色也是cvScalar类型
故我猜测在出错的那个位置,如果使用的不是cvSetReal2D而是cvSet2D,也许就不会出错了,因为cvSet2D同样是采用的cvScalar类型。但是在书中指出,cvSetReal2D是用于单通道的矩阵元素赋值,cvSet2D是RGB通道的赋值,创建的矩阵是32位浮点单通道,为什么用cvSetReal2D会失败呢?也许原因在于使用了cvLine函数以后,虽然矩阵依然是单通道,但是数据类型被变换成了cvScalar。
要搞清楚矩阵中,字节和位数的排列是一件很复杂的事情,甚至于书中都没有提到,简单的来说,如果矩阵初始化的时候,用的cvSet函数,那后面最好都用cvSetND赋值;如果初始化用的是cvZero,那后面用cvSetReal也可以

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多