OpenCV Mat 只能用靜態數組定義時初始化,動態數組賦值給Mat需要逐元素進行. MATLAB,OpenCV,VS混合編程


opencv,vs2008和matlab混合編程。

 

一   問題 :  matlab不能找到vs2008編譯器:mex –setup 和 mbuild –setup 都不行。

      決 :  matlab2007b換成matlab2009a,總算可以了。

二  用靜態數組 (一維和二維,多維) 初始化Mat矩陣完全正確(注意維數匹配).

    問題  :  動態分配數組 (new ,delete) 初始化mat發生數據問題。

      解決 :  動態數組轉存為Mat類型 : Mat聲明大小可以通過參數傳遞,可以使用動態數組的大小變量,進行動態指定;

                                                     定義完成后, 逐元素掃描動態數組,然后將對應下標的元素值賦值給Mat矩陣;

void 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異常

#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[])
{
/* dynamic allocate the dynamic array ,and initialed it by NULL */
float **data=NULL;   

data=new float*[4];   
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);
/* The above sentence changed as follow .*/
Mat mat_data = Mat(4,8,CV_32FC1);
for (int i = 0; i < 4; i++) {
    for (int j = 0 ; j < 8 ; j++) {
         mat_data.at<float>(i,j) = data[i][j];
    }
}
CvMat mat_data=cvMat(4,8,CV_32FC1,s_data1);
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;
}
 

跟蹤調試 原來mat中*data是一維指針,如果用二維動態數組初始化的話,讀取的是地址,而不是其中的數據

 

Mat Initialed by User Data Pointer

如下例:

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM