c++ - OpenCV C++ imgdecode 在 OSX 上生成异常
问题描述
我有一个应用程序,它从相机拍照,对它们进行编码,做一些事情,然后解码它们。它适用于 Ubuntu,但在 OSXimgdecode
上会产生以下异常:
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 $@
解决方案
我解决了将参数更改为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;
}
推荐阅读
- node.js - 从 GitHub 执行 NodeJS 包
- java - 在 Eclipse 中创建类时未列出的包
- java - CompletableFuture.runAsync 和 thenRunAsync 导致程序阻塞
- django-rest-framework - 如何仅将另一个序列化程序用于 CREATE 响应?
- javascript - JQuery按选择值隐藏行中的字段
- python - doctest 失败,没有显示统一的差异
- keycloak - 如何将元数据库与 Keycloak 连接?
- objective-c - 如何在 Objective-C 中比较 unsigned char?
- java - 如何使用缓冲流 I/O Java 从文本文件中搜索关键字列表
- ios - Swift-如何将单元格项目的数量划分为部分?