Ошибка отладки - вызов чисто виртуальной функции R6025 (виртуальный вызов не вызывается)

Я новичок в C++ и пытаюсь пройти через некоторые учебники OpenCV, которые я нашел в Интернете. Я создал код в точности так, как он был найден в Visual Studio 2013, и смог правильно его запустить. Тем не менее, я продолжаю получать сообщение об ошибке:

(Нажмите "Повторить" для отладки приложения) Ошибка отладки!

Программа:... rface_Basics \ x64 \ Debug \ OpenCV_Basics_CPP_Interface_Basics.exe

R6025 - чисто виртуальный вызов функции

(Нажмите "Повторить" для отладки приложения)

Я читал о чисто виртуальных функциях, и это звучало так, как будто вам нужно было хотя бы объявить виртуальную функцию, чтобы эта ошибка произошла, что только привело к еще большей путанице. Ниже мой код:

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

Любая помощь в решении этой проблемы будет принята с благодарностью.

2 ответа

Решение

Использование статического или глобального 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, и они не давали таких ошибок).

Другие вопросы по тегам