Измените формат изображения OpenCV на формат matlab, отладьте утверждение __acrt_first_block == заголовок
Я пытаюсь преобразовать изображение 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.
Спасибо, Пэт
2 ответа
С вашим кодом, созданным в 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;
}
Протестировано с этим изображением (взято с https://raw.githubusercontent.com/zukun/rcc/master/shape_sharing/code_release/pascal/VOC2010/JPEGImages/2008_000027.jpg)
Стандартный вывод:
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
-----------------------------------------------------------------
Сконфигурируйте opencv с выключенным "BUILD_WITH_STATIC_CRT", по умолчанию он включен. Я получал тот же сбой утверждения, когда я вызывал DetectMultiScale из отдельного потока, и вызывающая функция возвращалась, пока я не перекомпилировал opencv с выключенным этим флагом.