opencv - 为什么从 Julia 调用 OpenCV.pyrDown() 可以将图像大小减半,但不能将其四等分?
问题描述
我最近创建了一个带有 Julia 绑定的 OpenCV 版本。这可能是因为我是 Julia 的新手,但是为 opencv 函数调用输入适当的参数一直是个挑战。无论如何,我设法让下面的代码正确执行,以便它渲染从网络摄像头捕获的图像的半比例版本,只有一点延迟和 15 fps,但是当我重新运行它并改变比例时图像缩小到四分之一大小,它核心转储。
所以这有效:
print("Initializing OpenCV...")
using Printf
using OpenCV
cv = OpenCV
cap = cv.VideoCapture("/dev/video0")
global count = 0
print("Ready\n ",count)
scaleDown = 2
while (cv.isOpened(cap))
global count
ret,img = cv.read(cap)
c,w,h=size(img)
@printf("%d %d %d\n",c,w,h)
sz = cv.Size(Int32(w÷scaleDown),Int32(h÷scaleDown))
img2 = cv.pyrDown(img,dstsize=sz)
count = count + 1
cv.imshow("Down",img2)
if cv.waitKey(Int32(1)) & 0xFF == Int('q')
break
end
end
cv.release(cap)
cv.destroyAllWindows()
print(count)
但是,如果 scaleDown 设置为 4,则结果为:
signal (6): Aborted
in expression starting at /home/kevin/Projects3/video-test.jl:15
gsignal at /usr/bin/../lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /usr/bin/../lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x7f27ba2e3675)
_ZN2cv5errorEiRKNSt7__ ... _wrapEUlS2_S2_S5_S6_E387_E9_M_invokeERKSt9_Any_dataS2_S2_S5_S6_ at /home/kevin/Projects2/build/OpenCV/src/lib/libopencv_julia (unknown line)
_ZN5jlcxx6detail11CallFunctorIN2cv3MatEJRS3_S4_RNS2_5Size_IiEERiEE5applyEPKvNS_13WrappedCppPtrESC_SC_SC_ at /home/kevin/Projects2/build/OpenCV/src/lib/libopencv_julia (unknown line)
jlopencv_cv_cv_pyrDown at /home/kevin/.julia/packages/CxxWrap/ZOkSN/src/CxxWrap.jl:590
pyrDown at /home/kevin/Projects2/build/OpenCV/src/cv_cxx_wrap.jl:1162 [inlined]
#pyrDown#57 at /home/kevin/Projects2/build/OpenCV/src/cv_cxx_wrap.jl:1164 [inlined]
pyrDown##kw at /home/kevin/Projects2/build/OpenCV/src/cv_cxx_wrap.jl:1164
unknown function (ip: 0x7f279e09f055)
top-level scope at /home/kevin/Projects3/video-test.jl:21
unknown function (ip: 0x7f27be5ec030)
unknown function (ip: 0x7f27be5c7105)
jl_load at /usr/bin/../lib/x86_64-linux-gnu/libjulia.so.1 (unknown line)
include at ./Base.jl:377
exec_options at ./client.jl:288
_start at ./client.jl:484
jfptr__start_2075.clone_1 at /usr/lib/x86_64-linux-gnu/julia/sys.so (unknown line)
unknown function (ip: 0x55ece9ac99d9)
unknown function (ip: 0x55ece9ac95a6)
__libc_start_main at /usr/bin/../lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x55ece9ac964d)
Allocations: 10815726 (Pool: 10814596; Big: 1130); GC: 3
Aborted (core dumped)
为什么?
解决方案
请参阅https://docs.opencv.org/3.4/d4/d86/group__imgproc__filter.html#gaf9bba239dfca11654cb7f50f889fc2ff上的 pyrDown 文档
特别是,我相信 dstsize 不符合条件并导致提出断言。出于某种原因,您的构建没有正确处理它。
我用调试版本尝试了同样的事情,我得到了正确的错误消息
ERROR: OpenCV(4.4.0-pre) /home/archit/GSoC_Work/opencv/modules/imgproc/src/pyramids.cpp:759: error: (-215:Assertion failed) ssize.width > 0 && ssize.height > 0 && std::abs(dsize.width*2 - ssize.width) <= 2 && std::abs(dsize.height*2 - ssize.height) <= 2 in function 'pyrDown_'
Stacktrace:
[1] jlopencv_cv_cv_pyrDown(::OpenCV.CxxMatAllocated, ::OpenCV.CxxMatAllocated, ::OpenCV.Size{Int32}, ::Int32) at /home/archit/.julia/packages/CxxWrap/ZOkSN/src/CxxWrap.jl:590
[2] pyrDown at /home/archit/GSoC_Work/opencv_build/OpenCV/src/cv_cxx_wrap.jl:1141 [inlined]
[3] #pyrDown#57 at /home/archit/GSoC_Work/opencv_build/OpenCV/src/cv_cxx_wrap.jl:1143 [inlined]
[4] top-level scope at ./REPL[9]:7
您能否分享您与构建命令一起使用的 Julia 的确切版本,以便我可以确定错误未正确处理的原因?
推荐阅读
- python-3.x - 将模型训练的进度记录到日志文件中(不使用 tqdm)
- python - 在 Pandas 上复制自连接方法 SQL
- python - 网站发生了什么变化?
- node.js - Node JS - 错误 JavaScript 堆内存不足
- typescript - 在猫鼬的另一个文档中添加创建文档的 ID
- c# - 如何使用按钮单击事件从数据库表中的文本框中获取内容?
- python - Discord.py bot - 如何让 bot 复制我的消息
- r - 根据 R 中的周期变量创建自定义周变量
- r - 用 NA 转置
- flutter - Flutter 音频播放器自动暂停选项?(just_audio)