【问题标题】:OpenCV C++ imgdecode generating an exception on OSXOpenCV C++ imgdecode 在 OSX 上生成异常
【发布时间】:2020-07-21 06:44:37
【问题描述】:

我有一个应用程序,它可以从相机拍摄照片,对它们进行编码,做一些事情然后解码它们。它可以在 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 上?

发布脚本

如果需要编译代码,可以使用以下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) 为什么要读取图像,将其不必要地转换为内存中的 PNG,然后再将其转换回Mat? 2) 你为什么要从缓冲区中实例化一个Mat 来解码——当然你可以只传递buf_in 向量而不创建Mat 吗? 3)也许您可以先在单独的行上为imdecode() 实例化您的Mat,然后在下一行将结果传递给imdecode(),以便我们可以查看错误是在实例化Mat 还是在解码它?
  • 1) 代码只是一个minimal reproducible example,用于在更复杂的情况下显示我的问题。原始程序是客户端服务器应用程序:图像在服务器端编码,作为原始数据发送到客户端,然后解码并显示。 2) 你的意思是frame = imdecode(buf_in)?我可以试试。 3) 我也试试,好主意。

标签: c++ image macos opencv decoding


【解决方案1】:

我解决了将imdecode 的参数更改为包含原始数据的vector&lt;u_char&gt;,而不是初始化一个新的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;

}

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多