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
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.
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 -----------------------------------------------------------------