Change OpenCV image format to matlab format, debug assertion __acrt_first_block == header

匿名 (未验证) 提交于 2019-12-03 08:54:24

问题:

I am trying to convert an OpenCV Image (of type cv::Mat) into matlab-style format as this is what the rest of the program quires. I am using the following code to do that:

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; } 

It crashes with a debug assertion:

__acrt_first_block == header 

on the last line (return MatlabImage). Tracing back the source of the assertion, it seems to be connected to deallocating the vector ColorChannels. I have tried multiple ways of doing so, i.e. using .clear, using the swap trick, or deallocating every item in the vector but the assertation remains.

If embedded into the main function of the C++ program, this code works perfectly, it just won't to so in a dedicated function.

I simplified the main function, which calls the above code to the bare 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); } 

The problem remains the same:

I am using Visual Studio 2015. It runs fine in release mode but throws the debug assertion in debug mode (obviously), specifically it is pointing to the debug_heap.cpp, Line 980.

Thank you Pat

回答1:

Configure opencv with "BUILD_WITH_STATIC_CRT" off, its on by default. I was getting the same assertion failure when i called detectMultiScale from a separate thread, and the calling function returned, until i recompiled opencv with that flag turned off.



回答2:

With your code, built with Visual Studio 2015, I get your debug assertion __acrt_first_block == header.

The following code does not give the assertion, I simply changed std::vector<cv::Mat> ColorChannels; to cv::Mat ColorChannels[3];.

I think that my solution is quick and dirty and maybe the solution offered by iedoc is better (I did not test it).

#include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp"  inline double* ConvertCVImageToMATLABImage(cv::Mat &CvImage) {     cv::Mat ColorChannels[3]; // 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; }  #include <iostream> int main(int,char**) {     std::cout << cv::getBuildInformation();     cv::Mat CvImage = cv::imread("c:\\img\\2008_000027.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file     double* Image = ConvertCVImageToMATLABImage(CvImage);     return 0; } 

Tested with this image (taken from https://raw.githubusercontent.com/zukun/rcc/master/shape_sharing/code_release/pascal/VOC2010/JPEGImages/2008_000027.jpg)

Standard output is:

General configuration for OpenCV 2.4.4 =====================================   Version control:               unknown    Platform:     Host:                        Windows 6.1 x86     CMake:                       2.8.10.2     CMake generator:             Visual Studio 11 Win64     CMake build tool:            C:/PROGRA~2/MICROS~3.0/Common7/IDE/devenv.com     MSVC:                        1700    C/C++:     Built as dynamic libs?:      YES     C++ Compiler:                C:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/bin/x86_amd64/cl.exe  (ver 17.0.60315.1)     C++ flags (Release):         /DWIN32 /D_WINDOWS /W4  /GR /EHa  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /wd4251 /MD /O2 /Ob2 /D NDEBUG  /Zi     C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4  /GR /EHa  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /wd4251 /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1      C Compiler:                  C:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/bin/x86_amd64/cl.exe     C flags (Release):           /DWIN32 /D_WINDOWS /W3   /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /MD /O2 /Ob2 /D NDEBUG  /Zi     C flags (Debug):             /DWIN32 /D_WINDOWS /W3   /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1      Linker flags (Release):      /STACK:10000000 /machine:x64   /INCREMENTAL:NO  /debug     Linker flags (Debug):        /STACK:10000000 /machine:x64   /debug /INCREMENTAL      Precompiled headers:         YES    OpenCV modules:     To be built:                 core imgproc flann highgui features2d calib3d ml video objdetect contrib nonfree photo legacy gpu python stitching ts videostab     Disabled:                    world     Disabled by dependency:      -     Unavailable:                 androidcamera java ocl    GUI:      QT 4.x:                      NO     Win32 UI:                    YES     OpenGL support:              NO    Media I/O:      ZLib:                        build (ver 1.2.7)     JPEG:                        build (ver 62)     PNG:                         build (ver 1.5.12)     TIFF:                        build (ver 42 - 4.0.2)     JPEG 2000:                   build (ver 1.900.1)     OpenEXR:                     build (ver 1.7.1)    Video I/O:     FFMPEG:                      YES (prebuilt binaries)       codec:                     YES (ver 53.61.100)       format:                    YES (ver 53.32.100)       util:                      YES (ver 51.35.100)       swscale:                   YES (ver 2.1.100)       gentoo-style:              YES     OpenNI:                      NO     OpenNI PrimeSensor Modules:  NO     PvAPI:                       NO     GigEVisionSDK:               NO     DirectShow:                  YES     XIMEA:                       NO    Other third-party libraries:     Use IPP:                     NO     Use Eigen:                   NO     Use TBB:                     NO     Use OpenMP:                  NO     Use GCD                      NO     Use Concurrency              YES     Use C=:                      NO     Use Cuda:                    NO     Use OpenCL:                  NO    Python:     Interpreter:                 C:/Python27/python.exe (ver 2.7.3)     Libraries:                   C:/Python27/libs/python27.lib (ver 2.7.3)     numpy:                       C:/Python27/lib/site-packages/numpy/core/include (ver 1.7.0)     packages path:               C:/Python27/Lib/site-packages    Java:     ant:                         NO     JNI:                         NO     Java tests:                  YES    Documentation:     Build Documentation:         NO     Sphinx:                      NO     PdfLaTeX compiler:           NO    Tests and samples:     Tests:                       YES     Performance tests:           YES     C/C++ Examples:              NO    Install path:                  C:/opencv/opencv244/visual_studio/install    cvconfig.h is in:              C:/opencv/opencv244/visual_studio ----------------------------------------------------------------- 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!