OpenCV Mat 只能用静态数组定义时初始化,动态数组赋值给Mat需要逐元素进行. MATLAB,OpenCV,VS混合编程
opencv,vs2008和matlab混合编程。
一 问题 : matlab不能找到vs2008编译器:mex –setup 和 mbuild –setup 都不行。
决 : matlab2007b换成matlab2009a,总算可以了。
二 用静态数组 (一维和二维,多维) 初始化Mat矩阵完全正确(注意维数匹配).
问题 : 动态分配数组 (new ,delete) 初始化mat发生数据问题。
解决 : 动态数组转存为Mat类型 : Mat声明大小可以通过参数传递,可以使用动态数组的大小变量,进行动态指定;
定义完成后, 逐元素扫描动态数组,然后将对应下标的元素值赋值给Mat矩阵;
12345678910111213141516171819202122void
dynamicArrToMat(
int
rows,
int
cols){
/* Dynamic Array declaration and Initialization */
float
**fData = NULL;
fData =
new
float
*[4];
for
(
int
i = 0 ; i < 4 ; i++) {
fData[i] =
new
float
[8];
}
for
(
int
i = 0; i < 4; i++) {
for
(
int
j = 0; j < 8; j++) {
fData[i][j] = 2.0;
}
}
/* Mat matrix declaration and Initialization by the element copy from dynamic array */
Mat mat_fData(4,8,CV_32FC1);
for
(
int
i = 0; i < 4; i++) {
for
(
int
j = 0; j < 8; j++) {
mat_fData.at<
float
>(i,j) = fData[i][j];
}
}
}
下面的这个例子中,静态数组s_data,s_data1,n_data初始化mat_data都没问题.
但动态数组data初始化mat_data后,输出打印Mat数据,数据出现-42000000000000异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include "stdafx.h" #include "iostream" #include "stdlib.h" #include "stdio.h" #include <cv.h> #include <highgui.h> using namespace std; float s_data[4][8]={{1006,932,1006,1006,859,1006,932,1006}, {1333,1333,1247,1333,1247,1247,1247,1247}, {1840,1840,1840,1778,1778,1778,1716,1778}, {3374,3328,3465,3419,3419,3419,3374,3419}}; float s_data1[32]={1006,932,1006,1006,859,1006,932,1006, 1333,1333,1247,1333,1247,1247,1247,1247, 1840,1840,1840,1778,1778,1778,1716,1778, 3374,3328,3465,3419,3419,3419,3374,3419}; int _tmain( int argc, _TCHAR* argv[]) { |
1 2 3 4 | <font color= "#ff00ff" > /* dynamic allocate the dynamic array ,and initialed it by NULL */ </font> <font color= "#ff0000" > float **data=NULL; </font> data= new float *[4]; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | for ( int i=0;i<4;i++) // Initalized the dynamic array; data[i]= new float [8]; for ( int i=0;i<4;i++) { for ( int j=0;j<8;j++) data[i][j]=s_data[i][j]; } for ( int i=0;i<4;i++) { for ( int j=0;j<8;j++) cout<<data[i][j]<< " " ; cout<<endl; } float n_data[4][8]; for ( int i=0;i<4;i++) { for ( int j=0;j<8;j++) n_data[i][j]=data[i][j]; } // CvMat *mat_data=cvCreateMat(5,7,CV_32SC1); // cvInitMatHeader(mat_data,5,7,CV_32SC1,data); |
1 | <font color= "#ff00ff" > /* <font color="#ff0000">The above sentence changed as follow</font> .*/ </font> |
1 | <font color= "#0080ff" >Mat mat_data = Mat(4,8,CV_32FC1);</font> |
1 | <font color= "#0080ff" > for ( int i = 0; i < 4; i++) {</font> |
1 | <font color= "#0080ff" > for ( int j = 0 ; j < 8 ; j++) {</font> |
1 | <font color= "#0080ff" > mat_data.at< float >(i,j) = data[i][j];</font> |
1 | <font color= "#0080ff" > }</font> |
1 | <font color= "#0080ff" >}</font> |
1 | CvMat mat_data=cvMat(4,8,CV_32FC1,s_data1); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CvMat mat_data; cvInitMatHeader(&mat_data,5,7,CV_32FC1,data); for ( int i=0;i<4;i++) { for ( int j=0;j<8;j++) cout<<cvmGet(&mat_data,i,j)<< " " ; cout<<endl; } getchar(); return 0; } |
1 | |
跟踪调试 原来mat中*data是一维指针,如果用二维动态数组初始化的话,读取的是地址,而不是其中的数据:
如下例:
int cols = 300, rows = 200;
float* myarr = new float[rows*cols];
/* 第一步,初始化 CvMat 头*/
/* 这里更改为逐元素赋值复制,Mat声明时其大小可以通过参数传递,动态指定 */
CvMat mat = cvMat( rows, cols,
CV_32FC1, // 32 位浮点单通道类型
myarr // 用户数据指针(数据没有被复制)
);
/* 第二步,使用 cv 函数, 例如计算 l2 (Frobenius) 模 */
double norm = cvNorm( &mat, 0, CV_L2 );
...
delete myarr;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)