2011-04-13 15 views
15

Normalmente, si mis datos no son const, puedo inicializar un encabezado cv :: Mat encima de él para la manipulación algebraica.Crear cabecera cv :: Mat para datos const

float awesome_data[24] = {0}; 
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, awesome_data); 

Pero, si mis datos están const

const float awesome_data[24] = {0}; 
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, awesome_data); 

tendrán un error: unable to convert from const void * to void *. Sé que no cambiaré awesome_mat, ¿cuál es la mejor manera de hacer esto?

Actualmente, tengo que hacer una constante fundido

const float awesome_data[24] = {0}; 
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data)); 
+0

y qué está tratando de lograr con eso? – fazo

+0

Si un objeto es cv :: Mat, puedo realizar cualquier operación algebraica, procesamiento de imágenes, ... lineal. ¿Qué no puedo hacer con eso? :-) –

+0

No me refiero a eso. Const_cast funciona: ¿hay algo más que desee o espere? – fazo

Respuesta

-2

I qould escribo sin molde const como:

const float awesome_data[24] = {0}; 
Mat awesome_mat = Mat(6, 4, CV_32F, (void*)awesome_data,0); 
+0

¿Y por qué esta solución sería mejor que const_cast <>? –

2

Por lo que yo sé, OpenCV no tiene una clase const_Mat. Sin embargo, mediante el uso de

const float awesome_data[24] = {0}; 
const cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data)); 

a preservar constness.

+2

Tu publicación parece no coincidir con la de @R1tschY (y según mi experiencia). ¿Podría comentar qué tipo de 'constness' quiere decir, para no confundir a nadie? – MaciekS

2

Los datos en cv::Mat siempre se pueden modificar. Para ser más segura que debe copiar los datos:

const float awesome_data[24] = {0}; 
cv::Mat awesome_mat = cv::Mat(6, 4, CV_32F, const_cast<float *>(awesome_data)).clone(); 

Con const cv::Mat sólo el encabezado de la matriz es de sólo lectura, pero no los datos (Differences of using "const cv::Mat &", "cv::Mat &", "cv::Mat" or "const cv::Mat" as function parameters?):

const cv::Mat mat = cv::Mat::zeros(6, 4, CV_32F); 
mat += 1; // compiles and runs fine! 
Cuestiones relacionadas