首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何阻止OpenCV错误消息在Python中打印

如何阻止OpenCV错误消息在Python中打印
EN

Stack Overflow用户
提问于 2018-04-01 12:47:06
回答 2查看 4.6K关注 0票数 8

这个问题在这里一样,除了Python,而不是C++。

我在OpenCV中有一条错误消息,即使我在它周围做了一个除了捕获,它也是打印的。

有关问题的解决办法建议使用重定向函数,但是这句话建议在Python中不存在函数。

如何在允许我准确打印所需内容的同时阻止OpenCV错误消息的打印?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-01 18:30:40

在编写此答案时(OpenCV 3.4.1是最后发布的版本),没有办法只过滤默认错误处理程序的输出(我可以想到),也没有办法更改错误处理程序。

然而,你的问题让我思考--在highgui模块中,我们已经有了几个函数,可以为鼠标、trackbar和按钮事件设置Python回调,这样我们就可以从代码中获得灵感,并在其中修补这个新功能。

让我们使用3.4.1版本。感兴趣的文件是modules/python/src2/cv2.cpp。我们将首先从函数OnMousepycvSetMouseCallback获得灵感。

让我们让Python处理程序有一个与C++错误处理程序匹配的签名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error_handler([int]status, [str]func_name, [str]err_msg, [str]file_name, [int]line, [obj]userdata) -> None

让我们还添加对默认错误处理程序的重置支持--这是highgui函数尚未做的事情。

首先,我们需要一个静态错误处理函数,它将将参数从C++封送到Python,并调用适当的Python函数来处理错误。就像我们正在获得灵感的函数一样,我们将使用用户数据参数来保存一个由函数对象和可选Python用户数据组成的元组)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int OnError(int status, const char *func_name, const char *err_msg, const char *file_name, int line, void *userdata)
{
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();

    PyObject *o = (PyObject*)userdata;
    PyObject *args = Py_BuildValue("isssiO", status, func_name, err_msg, file_name, line, PyTuple_GetItem(o, 1));

    PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
    if (r == NULL) {
        PyErr_Print();
    } else {
        Py_DECREF(r);
    }

    Py_DECREF(args);
    PyGILState_Release(gstate);

    return 0; // The return value isn't used
}

接下来,我们需要编写函数来实现PythonandC++之间的绑定。但是,由于我的怀疑潜在的内存泄漏在我们正在汲取灵感的函数中,我们将添加一些来修复这个问题--我们将跟踪最近的用户数据对象,并在必要时取消它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Keep track of the previous handler parameter, so we can decref it when no longer used
static PyObject* last_on_error_param = NULL;

static PyObject *pycvRedirectError(PyObject*, PyObject *args, PyObject *kw)
{
    const char *keywords[] = { "on_error", "param", NULL };
    PyObject *on_error;
    PyObject *param = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kw, "O|O", (char**)keywords, &on_error, &param))
        return NULL;

    if ((on_error != Py_None) && !PyCallable_Check(on_error))  {
        PyErr_SetString(PyExc_TypeError, "on_error must be callable");
        return NULL;
    }
    if (param == NULL) {
        param = Py_None;
    }

    if (last_on_error_param) {
        Py_DECREF(last_on_error_param);
        last_on_error_param = NULL;
    }

    if (on_error == Py_None) {
        ERRWRAP2(redirectError(NULL));        
    } else {
        last_on_error_param = Py_BuildValue("OO", on_error, param);
        ERRWRAP2(redirectError(OnError, last_on_error_param));
    }
    Py_RETURN_NONE;
}

最后,我们必须注册我们的“特殊方法”。与我们从中获得灵感的函数不同,我们不依赖于某些GUI,我们希望它始终可用,因此我们将修改代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static PyMethodDef special_methods[] = {
  {"redirectError", (PyCFunction)pycvRedirectError, METH_VARARGS | METH_KEYWORDS, "redirectError(onError [, param]) -> None"},
#ifdef HAVE_OPENCV_HIGHGUI
  {"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
  {"createButton", (PyCFunction)pycvCreateButton, METH_VARARGS | METH_KEYWORDS, "createButton(buttonName, onChange [, userData, buttonType, initialButtonState]) -> None"},
  {"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_VARARGS | METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
#endif
  {NULL, NULL},
};

现在我们可以重新构建OpenCV,安装并测试它。我编写了以下脚本来演示该功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2

def verbose_error_handler(status, func_name, err_msg, file_name, line, userdata):
    print "Status = %d" % status
    print "Function = %s" % func_name
    print "Message = %s" % err_msg
    print "Location = %s(%d)" % (file_name, line)
    print "User data = %r" % userdata

def silent_error_handler(status, func_name, err_msg, file_name, line, userdata):
    pass


print "** Default handler"
try:
    cv2.imshow("", None) # This causes an assert
except cv2.error as e:
    pass

print "** Using verbose handler"
cv2.redirectError(verbose_error_handler, 42)
try:
    cv2.imshow("", None) # This causes an assert
except cv2.error as e:
    pass

print "** Using silent handler"
cv2.redirectError(silent_error_handler)
try:
    cv2.imshow("", None) # This causes an assert
except cv2.error as e:
    pass

print "** Back to default handler"
cv2.redirectError(None)
try:
    cv2.imshow("", None) # This causes an assert
except cv2.error as e:
    pass

使用我的修补版本的OpenCV (基于上面的说明),我在控制台上得到了以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
** Default handler
OpenCV(3.4.1) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file F:\GitHub\opencv\modules\highgui\src\window.cpp, line 364
** Using verbose handler
Status = -215
Function = cv::imshow
Message = size.width>0 && size.height>0
Location = F:\GitHub\opencv\modules\highgui\src\window.cpp(364)
User data = 42
** Using silent handler
** Back to default handler
OpenCV(3.4.1) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file F:\GitHub\opencv\modules\highgui\src\window.cpp, line 364

在我开始写这个答案的时候,我的一个想法是,由于默认错误处理程序使用下面的格式化字符串将所有这些消息输出到stderr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"OpenCV(%s) Error: %s (%s) in %s, file %s, line %d"

我们也许可以将stderr流挂起来,并筛选出以常量前缀开头的任何行。唉,我没有做到这一点。也许其他人可以?

编辑:修补程序合并到opencv:master中,做了一些小修改(主要是去掉了用户数据参数,因为它在Python中是不必要的)。

票数 11
EN

Stack Overflow用户

发布于 2021-10-27 18:54:10

这个建议的答案对我没有用--我从来没见过回调电话。但是,可以使用环境变量OpenCV来控制如图所示日志记录。

我假设环境变量在启动时只读取一次,所以最好在导入之前设置它。

如果你想要所有的消息都消失了,你可以用这个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
os.environ["OPENCV_LOG_LEVEL"]="SILENT"
import cv2

或者仅仅是为了抑制错误(并且更低):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
os.environ["OPENCV_LOG_LEVEL"]="FATAL"
import cv2

有关其他值,请参见OpenCV日志级别定义

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49602465

复制
相关文章
如何用OpenCV在Python中实现人脸检测
本教程将介绍如何使用 OpenCV 和 Dlib 在 Python 中创建和运行人脸检测算法。同时还将添加一些功能,以同时检测多个面部的眼睛和嘴巴。本文介绍了人脸检测的最基本实现,包括级联分类器、HOG 窗口和深度学习 CNN。
小小詹同学
2019/06/03
1.5K0
如何用OpenCV在Python中实现人脸检测
https://github.com/maelfabien/Machine_Learning_Tutorials
机器之心
2019/05/30
1.5K0
python try语句如何打印错误行(
打印当前.py文件错误行: import sys try: a = [1,2] print a[3] except: s=sys.exc_info() print "Error '%s' happened on line %d" % (s[1],s[2].tb_lineno) 打印execfile的打印错误行: try: execfile("tprint.py") except Exception, info: #print info[1] print "Error '%s' happe
py3study
2020/01/10
1.6K0
在条码打印软件中如何打印黑底白字标签
在条码打印软件中绘制普通文本添加文字的的时候,一般都是白底黑字的。但是有的时候,个别客户想要实现黑底白字的效果,这个在条码打印软件中该如何设置呢?接下来我们一起来看下在条码打印软件中将文字设置成黑底白字的操作步骤:
用户5746110
2019/09/10
2.3K0
如何使用OpenCV在Python中访问IP摄像头
首先,必须找出网址流是什么。通过在构造函数中提供摄像机的网址流,可以在OpenCV中访问IP摄像机cv2.VideoCapture。可以使用某些网络扫描实用程序(例如在linux上的arp-scan)找到摄像机的IP地址。网址进一步的细节,如Protocol,Credentials和Channel应该可以在相机说明书或软件/手机应用程序中找到。我们通过在网络上搜索相机的型号来找到相机的网址流。
小白学视觉
2020/09/14
6.7K0
在条码打印软件中如何打印黑底白字标签
在条码打印软件中绘制普通文本添加文字的的时候,一般都是白底黑字的。但是有的时候,个别客户想要实现黑底白字的效果,这个在条码打印软件中该如何设置呢?接下来我们一起来看下在条码打印软件中将文字设置成黑底白字的操作步骤:
用户5746110
2019/09/18
2.2K0
as3.0中如何阻止事件冒泡?
as3.0中的事件冒泡机制有时候会很烦人,比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后,如果两个Sprite都注册了Mouse_Down事件,要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件,默认是不行的,因为事件冒泡会让Container也响应Mouse_Down事件,示例代码: package { import flash.display.*; import flash.events.Mouse
菩提树下的杨过
2018/01/23
1.6K0
在python中配置opencv库,使用pycharm环境
最好安装opencv 2.几的版本(如2.4.13)安装的opencv3 的老是出现no modules的错误,换成2.几的就好了
bear_fish
2018/09/19
6.1K0
在python中配置opencv库,使用pycharm环境
在pycharm中安装opencv_pycharm opencv
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/175475.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1.4K0
在pycharm中安装opencv_pycharm opencv
在Anaconda中安装OpenCV
本人使用的是win10系统,anaconda版本为4.7.12,python版本为3.7.4
全栈程序员站长
2022/07/22
2K0
在Anaconda中安装OpenCV
在标签打印软件中如何快速对齐标签内容
在标签打印软件中制作标签的时候,有的时候标签内容比较多,文字长短不一,如果不好好排版的话,会感觉很乱,为了标签的美观,在标签打印软件中添加完需要的文字之后,可以选择我们想要排版的文字,点击软件中的对齐按钮,使标签内容迅速对齐。具体操作如下:
用户5746110
2019/09/10
4.2K0
如何编写有用的错误消息?
作者 | James Cleaver 译者 | 王强 策划 | 万佳 错误消息的领域涉及很多方面的内容。它们需要将 UX 领域的几乎所有元素(信息、说明、界面、微文案)结合起来,并且用几句话将这些信息阐述清楚。所有这些元素都是为了一个共同的目标:在出现问题时帮助用户。 错误消息需要快速、清晰地通知、指导和引导用户 但上面的说法还是太简单了,因为错误消息还需要包含以下内容: 你的站点或系统的结构:用户和开发人员都不希望看到无穷无尽、含义各异的文本字符。所以你需要考虑为之编写错误消息的系统上下文。你需要找出系
深度学习与Python
2023/04/01
9040
如何编写有用的错误消息?
打印机扫描smb错误_打印服务器错误不能提供打印
1、首先要检查打印机是否处于联机状态,如果打印机没有联机是无法进行工作的,检查打印机与电脑之间的连线是否正确。
全栈程序员站长
2022/11/03
4.7K0
python: 在图片上 打印中文
我整理的代码模板: # 指定字体文件地址 FONT_FILE_PATH = ... # 转换成PIL src_img = cv2.imread(img_path) img_PIL = Image.fromarray(cv2.cvtColor(src_img, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img_PIL) # 配置参数 text = "Hello Nanjing !" normal_color, sum_color = (255, 255,
JNingWei
2018/09/27
1.6K0
JavaScript 中如何打印对象
我们一般通过使用 console.log 把变量或者对象输出到浏览器的控制台(console)的方法调试 JavaScript 程序,但是在移动端开发 JS 程序的时候,就没有那么好方便,可以使用 console.log 的方式来调试,对于变量我们可以使用 alert 函数来输出进行调试,如果变量,使用 alert 函数的话,浏览器只会告诉你这个只是一个变量,而不能打印出里面的内容,非常不方便,于是整理总结如下的函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下:
Denis
2023/04/15
2K0
如何在 Python 中以表格格式打印列表?
在 Python 中,列表是一种常见的数据结构,用于存储和组织数据。当我们需要将列表的内容以表格形式展示时,可以通过特定的方法和技巧来实现。本文将详细介绍如何在 Python 中以表格格式打印列表,以便更好地展示和呈现数据。
网络技术联盟站
2023/06/01
1.7K0
在Python中如何使用Elasticsearch?
在这篇文章中,我将讨论Elasticsearch以及如何将其整合到不同的Python应用程序中。
马哥linux运维
2019/06/10
8.1K0
在Python中如何使用Elasticsearch?
pip install opencv-python遇到的错误
Found existing installation: numpy 1.8.0rc1 DEPRECATION: Uninstalling a distutils installed project (numpy) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project. Uninstalling numpy-1.8.0rc1: Exception: Traceback (most recent call last): File “/Library/Python/2.7/site-packages/pip/basecommand.py”, line 215, in main status = self.run(options, args) File “/Library/Python/2.7/site-packages/pip/commands/install.py”, line 342, in run prefix=options.prefix_path, File “/Library/Python/2.7/site-packages/pip/req/req_set.py”, line 778, in install requirement.uninstall(auto_confirm=True) File “/Library/Python/2.7/site-packages/pip/req/req_install.py”, line 754, in uninstall paths_to_remove.remove(auto_confirm) File “/Library/Python/2.7/site-packages/pip/req/req_uninstall.py”, line 115, in remove renames(path, new_path) File “/Library/Python/2.7/site-packages/pip/utils/init.py”, line 267, in renames shutil.move(old, new) File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py”, line 302, in move copy2(src, real_dst) File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py”, line 131, in copy2 copystat(src, dst) File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py”, line 103, in copystat os.chflags(dst, st.st_flags) OSError: [Errno 1] Operation not permitted: ‘/tmp/pip-ByxPrJ-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy-1.8.0rc1-py2.7.egg-info’
matinal
2020/11/27
2.2K0
点击加载更多

相似问题

如何阻止selenium在python中打印webdriver消息?

13

在python中打印错误消息

22

如何打印和解释python错误消息

31

如何抑制OpenCV错误消息

11

在Python中打印简单消息

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文