Изменить формат изображения OpenCV на формат Matlab, отладочное утверждение

Я пытаюсь преобразовать изображение OpenCV (типа cv :: Mat) в формат matlab, как этого требует остальная часть программы. Я использую следующий код для этого:

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

Сбой с утверждением отладки:

__acrt_first_block == header

в последней строке (вернуть MatlabImage). Возвращаясь к источнику утверждения, он, похоже, связан с освобождением вектора ColorChannels. Я попробовал несколько способов сделать это, то есть использовать .clear, использовать трюк подкачки или освободить каждый элемент в векторе, но диссертация остается.

Если этот код встроен в основную функцию программы на C ++, он отлично работает, а в выделенной функции его просто нет.

Я упростил основную функцию, которая сводит приведенный выше код к минимуму:

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

Проблема остается той же: утверждение

Я использую Visual Studio 2015. Он отлично работает в режиме выпуска, но выбрасывает утверждение отладки в режиме отладки (очевидно), в частности он указывает на debug_heap.cpp, строка 980.

Спасибо Пат

4 голоса | спросил pAt84 28 +03002015-10-28T16:07:24+03:00312015bEurope/MoscowWed, 28 Oct 2015 16:07:24 +0300 2015, 16:07:24

2 ответа


0

Сконфигурируйте opencv с выключенным параметром «BUILD_WITH_STATIC_CRT», по умолчанию он включен. Я получал ту же ошибку подтверждения, когда я вызвал DetectMultiScale из отдельного потока, и вызывающая функция возвращалась, пока я не перекомпилировал opencv с выключенным этим флагом.

ответил iedoc 13 52015vEurope/Moscow11bEurope/MoscowFri, 13 Nov 2015 18:50:26 +0300 2015, 18:50:26
0

С вашим кодом, созданным в Visual Studio 2015, я получаю ваше утверждение отладки __acrt_first_block == header.

Следующий код не дает подтверждения, я просто изменил std::vector<cv::Mat> ColorChannels; на cv::Mat ColorChannels[3];

Я думаю, что мое решение быстрое и грязное и, возможно, решение , предлагаемое iedoc лучше (я не проверял).

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

Протестировано с этим изображением (взято с  введите описание изображения здесь

Стандартный вывод:

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
-----------------------------------------------------------------
ответил Alessandro Jacopson 9 J0000006Europe/Moscow 2016, 10:59:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132