Change OpenCV image format to matlab format, debug

2019-05-07 14:55发布

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: assertion

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

2条回答
Lonely孤独者°
2楼-- · 2019-05-07 15:02

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.

查看更多
我命由我不由天
3楼-- · 2019-05-07 15:24

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)

enter image description here

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
-----------------------------------------------------------------
查看更多
登录 后发表回答