Я новичок в C ++ и пытаюсь пройти через некоторые учебники OpenCV, которые я нашел в Интернете. Я создал код в точности так, как он был найден в Visual Studio 2013, и смог правильно его запустить. Тем не менее, я продолжаю получать сообщение об ошибке:
(Нажмите «Повторить» для отладки приложения) Ошибка отладки!
Программа:
… rface_Basics \ x64 \ Debug \ OpenCV_Basics_CPP_Interface_Basics.exeR6025
— чисто виртуальный вызов функции(Нажмите «Повторить» для отладки приложения)
Я читал о чисто виртуальных функциях, и звучало так, будто вам нужно было хотя бы объявить виртуальную функцию, чтобы эта ошибка произошла, что только привело к еще большей путанице. Ниже мой код:
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//main functions
void processImage();
void displayGraphics();
//images
Mat image;
Mat processedImage;
int main(int argc, char *argv[])
{
//create a window
namedWindow("Image");
namedWindow("ProcessedImage");
//load the image
if (argc > 1)
image = imread(argv[1]);
else
image = imread("lena.jpg");
if (image.empty())
exit(1);
processImage();
displayGraphics();
waitKey(0);
return 0;
}
void displayGraphics()
{
//display both images
imshow("Image", image);
imshow("ProcessedImage", processedImage);
}
void processImage()
{
int x, y;
Vec3b pixel;
unsigned char R, G, B;
processedImage = image.clone();
for (y = 0; y < processedImage.rows; y++)
{
for (x = 0; x < processedImage.cols; x++)
{
// Get the pixel at (x,y)
pixel = processedImage.at<Vec3b>(y, x);
// Get the separate colors
B = pixel[0];
G = pixel[1];
R = pixel[2];
// Assign the complement of each color
pixel[0] = 255 - B;
pixel[1] = 255 - G;
pixel[2] = 255 - R;
// Write the pixel back to the image
processedImage.at<Vec3b>(y, x) = pixel;
}
}
}
Я попытался удалить аргументы из основной функции и пройти процесс отладки, приведенный в цитате выше. Однако он просто вызывает этот файл crt0msg.c и выделяет случай 1 из раздела #ifdef _DEBUG.
Любая помощь в решении этой проблемы будет принята с благодарностью.
Использование статического или глобального Mat, вызывающего проблему.
Я нашел проблему, в
> MatAllocator* Mat::getStdAllocator() {
> static StdMatAllocator allocator;//it's static. but mat's destructor need >it. so when that's have a static or global mat, can not be guaranteed this >allocator's destructor after that static or global mat.
> return allocator;
> }
Источник:http://code.opencv.org/issues/3355
это открытый дефект в OpenCV (еще не исправлен).
Попробуйте обновить свое открытое резюме до последней версии, в записи о дефектах упоминается частичное исправление, которое, возможно, поможет вам решить эту проблему.
Mat image;
Mat processedImage;
Эта глобальная декларация является проблемой. Вызов
image.release();
processedImage.release();
перед
return 0;
в основном. Эта проблема, кажется, связана с недавним opencv3.0 (я использовал и альфа, и бета, и версии RC1, и они не давали таких ошибок).