<p>对于那些仍然需要知道如何做到这一点的人,我现在使用一些代码将像素数据从PyQt5获取到PyOpenCV,而无需保存和加载</p>
<p>由于PyOpenCV使用<code>numpy.array</code>代替OpenCV <code>Mat</code>,这应该可以回答这个问题</p>
<pre class="lang-py prettyprint-override"><code># Convert to 32-bit RGBA with solid opaque alpha
# and get the pointer numpy will want.
#
# Cautions:
# 1. I think I remember reading that PyQt5 only has
# constBits() and PySide2 only has bits(), so you may
# need to do something like `if hasattr(...)` for
# portability.
#
# 2. Format_RGBX8888 is native-endian for your
# platform and I suspect this code, as-is,
# would break on a big-endian system.
im_in = im_in.convertToFormat(QImage.Format_RGBX8888)
ptr = im_in.constBits()
ptr.setsize(im_in.byteCount())
# Convert the image into a numpy array in the
# format PyOpenCV expects to operate on, explicitly
# copying to avoid potential lifetime bugs when it
# hasn't yet proven a performance issue for my uses.
cv_im_in = np.array(ptr, copy=True).reshape(
im_in.height(), im_in.width(), 4)
cv_im_in = cv.cvtColor(cv_im_in, cv.COLOR_BGRA2RGB)
</code></pre>
<p>我仍在快速试验原型,因此尚未对其进行优化,但下面介绍如何进行优化:</p>
<ol>
<li>验证不存在取消引用悬空指针的风险,并从<code>np.array</code>构造函数中删除<code>copy=True</code></李>
<li>找到<code>QImage.convertToFormat</code>可以生成的格式,相关OpenCV模块可以直接对其进行操作,并跳过<code>cv.cvtColor</code>步骤。(我认为<code>Format_BGR888</code>就是这种格式,但目前我的项目中仍然需要支持5.14之前的Qt版本。)</li>
</ol>