J'essaie de convertir une image OpenCV (de type cv :: Mat) en format matlab car c'est ce que demande le reste du programme. J'utilise le code suivant pour le faire:Modification du format d'image OpenCV au format matlab, assertion de débogage __acrt_first_block == header
inline double* ConvertCVImageToMATLABImage(Mat &CvImage)
{
std::vector<cv::Mat> ColorChannels; // B, G, R channels
cv::split(CvImage, ColorChannels);
// remember to tranpose first because MATLAB is col-major!!!
cv::transpose(ColorChannels[0], ColorChannels[0]);
cv::transpose(ColorChannels[1], ColorChannels[1]);
cv::transpose(ColorChannels[2], ColorChannels[2]);
double *MatlabImage = new double[CvImage.rows*CvImage.cols * 3];
int CounterCompleteImage = 0;
int CounterEachColorChannel = 0;
for (CounterEachColorChannel = 0; CounterEachColorChannel<CvImage.rows*CvImage.cols; ++CounterEachColorChannel, ++CounterCompleteImage)
{
MatlabImage[CounterCompleteImage] = static_cast<double>(ColorChannels[2].data[CounterEachColorChannel]);
}
for (CounterEachColorChannel = 0; CounterEachColorChannel<CvImage.rows*CvImage.cols; ++CounterEachColorChannel, ++CounterCompleteImage)
{
MatlabImage[CounterCompleteImage] = static_cast<double>(ColorChannels[1].data[CounterEachColorChannel]);
}
for (CounterEachColorChannel = 0; CounterEachColorChannel<CvImage.rows*CvImage.cols; ++CounterEachColorChannel, ++CounterCompleteImage)
{
MatlabImage[CounterCompleteImage] = static_cast<double>(ColorChannels[0].data[CounterEachColorChannel]);
}
return MatlabImage;
}
Il se bloque avec une assertion de débogage:
__acrt_first_block == header
sur la dernière ligne (retour MatlabImage). En retraçant la source de l'assertion, il semble être connecté pour désallouer le vecteur ColorChannels. J'ai essayé plusieurs façons de le faire, c'est-à-dire en utilisant .clear, en utilisant le truc de swap, ou en désallocalisant chaque élément du vecteur mais l'assertion reste.
S'il est intégré dans la fonction principale du programme C++, ce code fonctionne parfaitement, il ne le sera pas dans une fonction dédiée.
I simplifié la fonction principale, qui appelle le code ci-dessus au strict minimum:
void main(void)
{
cv::Mat CvImage = imread("E:\\VOC2012\\VOCdevkit\\VOC2012\\JPEGImages\\2008_000027.jpg", CV_LOAD_IMAGE_COLOR); // Read the file
double* Image = ConvertCVImageToMATLABImage(CvImage);
}
J'utilise Visual Studio 2015. Il fonctionne très bien dans mode de libération, mais jette l'assertion de débogage en mode débogage (évidemment), en particulier, il pointe vers le debug_heap.cpp, ligne 980.
Merci Pat
Ce qui est exactement "le format Matlab"? B, B, B, ..., G, G, G, ..., R, R, R, au lieu de B, G, R, B, G, R, ... B, G, R? Et vont dans [0,1] au lieu de [0,255]? – Miki
pouvez-vous également fournir un petit _main_ qui appelle cette fonction et produire l'erreur? – Miki
ok, également colonnes et rangées inversées. puis 1) vous n'avez pas besoin d'appeler 'clear', puisque le vecteur sera libéré après la sortie de la fonction 2) cela fonctionne bien pour moi. S'il vous plaît fournir un exemple qui montre l'erreur – Miki