jjzjj

解决opencv中算术运算报错: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cp

简单厨宝 2023-05-13 原文

这几天使用opencv做一些图像处理的问题,进行到算术运算时就被卡住了,上网搜索总是不能解决我的问题。最后通过不断的尝试,终于得到解决!

报错提示:OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

或者是这样

OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'

 

 错误原因:经过本人n次的调试,得到以下三种方案

一.文件读取路径不对 

       这是我们常常会遇到的问题,大家英文水平不太高,习惯使用中文作为文件夹的名称便于查找,但是opencv就不惯着,但凡有一点中文都会报错(当时没报错,不代表第n次运行后也如此)。下面这种格式就是很好的习惯了。

import cv2  as cv
import numpy as np  

#读取图像
img = cv.imread("D:\jpg\lena.jpg",0)
cv.imshow("img",img)
cv.waitKey(0)

 如果不行的话,我们可以尝试在路径里使用双斜杆“//”(绝对路径),反斜杠"\"(linux的路径)

二. 图像的大小或者格式不一致

     这是我所遇到问题,首先我们读取图片的大小不一致的话,图片是无法融合的,因为图像的融合相当于是将矩阵内对应的像素值相加,如果像素值的个数都不相同的话,还如何进行融合呢?

解决办法

import cv2 as cv 
import numpy as np
img11=cv.imread("D:\lenargb.tif",1)
img11 = cv.resize(img11, (400, 400), interpolation=cv.INTER_AREA)#调整图片大小
img12=cv.imread("D:\\photo\\txcl\\sleep.jpg",1)
img12 = cv.resize(img12, (400, 400), interpolation=cv.INTER_AREA)#调整图片大小
add=cv.add(img11,img12)#加:实现图像融合
cv.imshow("w",add)
cv.waitKey(0)

只要我们将添加这样一行代码:

将两张图片的大小调成一致就可以了。

cv.resize(img, (400, 400), interpolation=cv.INTER_AREA)

 三.还有一种情况就是图片的格式不同,同理:

例如:假设图像1的数据类型为unit8,图像2的数据类型为float32,2个图像数据类型不一致时,add,subtract,multiply,divide等算术运算的返回图像又该是什么类型呢?

所以我们需要声明其数据类型。在算术运算add函数里面添加一个dtype参数,如下所示:

img = cv.add(img1,img2,dtype=cv2.CV_8UC3) #声明生成新的img的数据类型

有人会好奇,最后生成的图像又是什么类型的呢?

那么,我们可以使用:

img.dtype #查看img的类型

查看最终生成的图片是什么类型的啦!

小伙伴们也可以将过程中遇到的其他问题回复在评论区,我们一起讨论!

最后附上我的代码:

# 图像的基本运算加,减,逻辑运算  opencv 是大于255取255,numpy是取模
import cv2 as cv
image1=cv.imread("D:/opencv/lenargb.jpg",1)
image1 = cv.resize(image1, (400, 400), interpolation=cv.INTER_AREA)
image2=cv.imread("D:/opencv/\girl.jpg",1)
image2 = cv.resize(imgage2, (400, 400), interpolation=cv.INTER_AREA)
add=cv.add(image1,image2)#加法实现图像融合
sub=cv.subtract(image1,image2)#减法可实现图像目标运行的检测
cheng=cv.multiply(image1,image2)#乘法
chu=cv.divide(image1,image2)#除法可实现目标的位置判断
yu=cv.bitwise_and(image1,image2)#与运算
huo=cv.bitwise_or(image1,image2)#或运算
yihuo=cv.bitwise_xor(image1,image2)#异或运算
fei=cv.bitwise_not(image1)#非运算

#opencv在一个窗口显示多幅图像不方便
cv.imshow("image1",image1)
cv.imshow("image2",image2)
cv.imshow("add",add)
cv.imshow("sub",sub)
cv.imshow("yu",yu)
cv.imshow("huo",huo)
cv.imshow("yihuo",yihuo)
cv.imshow("fei",fei)
cv.waitKey(0)
cv.destroyAllWindows()

#matplotlib里显示多幅图像
import matplotlib.pyplot as plt
import cv2 as cv
add1=cv.cvtColor(add,cv.COLOR_BGR2RGB) #将bgr转换为rgb
sub1=sub[:,:,::-1]#将bgr转换为rgb
yu1=yu[:,:,::-1]
huo1=huo[:,:,::-1]
yihuo1=yihuo[:,:,::-1]
fei1=fei[:,:,::-1]

plt.figure()
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.subplot(231);plt.imshow(add1);plt.title("add1")
plt.subplot(232);plt.imshow(sub1);plt.title("sub1")
plt.subplot(233);plt.imshow(yu1);plt.title("yu1")
plt.subplot(234);plt.imshow(huo1);plt.title("huo1")
plt.subplot(235);plt.imshow(yihuo1);plt.title("yihuo1")
plt.subplot(236);plt.imshow(fei1);plt.title("fei1")

结果截图:

有关解决opencv中算术运算报错: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cp的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby - 为什么人们使用 `Module.send(:prepend, …)` ? - 2

    我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  9. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐