OpenCV C ++ imgdecode генерирует исключение в OSX - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть приложение, которое делает снимки с камеры, кодирует их, делает некоторые вещи и затем декодирует их. Он работает в Ubuntu, но в OSX imgdecode генерирует следующее исключение:

libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(4.2.0) /tmp/opencv-20200404-3398-7w1b75/opencv-4.2.0/modules/imgcodecs/src/loadsave.cpp:732: error: (-215:Assertion failed) buf.checkVector(1, CV_8U) > 0 in function 'imdecode_'

Abort trap: 6

Я попытался кодировать и декодировать изображение в том же сценарии, чтобы получить минимальный проверяемый пример. Сценарий выглядит следующим образом:

#include "opencv2/opencv.hpp"
#include<unistd.h>
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    Mat frame;
    VideoCapture cam(0);
    std::vector<uchar> buf_in;
    u_char *buf ;
    while(1)
    {
        cam>>frame;
        imencode(".png",frame, buf_in);
        //encode image and put data into the vector buf
        frame  = cv::imdecode(cv::Mat(3, buf_in.size(), CV_8UC3, buf_in.data()), 1);
        imshow("window", frame);
        waitKey(2);
    }
    return 0;

}

, и он все еще генерирует исключение в OSX. Это почему? Почему генерируется исключение? Почему только в OSX?

POST SCRIPTA

Если необходимо скомпилировать код, можно использовать следующий Makefile:

CXX = g++

CXXFLAGS = -std=c++11 -pg
INC_PATH = `pkg-config --cflags opencv4`

LIBS = `pkg-config --libs opencv4`

SOURCEDIR := ./
SOURCES := $(wildcard $(SOURCEDIR)/*.cpp)
OBJDIR=$(SOURCEDIR)/obj

OBJECTS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.d,$(SOURCES))
WARNING := -Wall -Wextra

.PHONY: all clean

all: openCV

clean:
    $(RM) $(OBJECTS) $(DEPENDS) openCV

openCV: $(OBJECTS)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)

-include $(DEPENDS)

$(OBJDIR):
    mkdir -p $(OBJDIR)

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile | $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) -MMD -MP -c $< -o $@

1 Ответ

0 голосов
/ 10 апреля 2020

Я решил изменить аргумент imdecode на vector<u_char>, содержащий необработанные данные, вместо инициализации новой структуры Mat.

#include "opencv2/opencv.hpp"
#include<unistd.h>
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    Mat frame;
    VideoCapture cam(0);
    std::vector<uchar> buf_in;
    u_char *buf ;
    while(1)
    {
        cam>>frame;
        imencode(".png",frame, buf_in);
        //encode image and put data into the vector buf
        buf_out.assign(buf_in.data, buf_in.data+buf_in.size());
        frame  = cv::imdecode(buf_out, 1);
        imshow("window", frame);
        waitKey(2);
    }
    return 0;

}
...