如何使用opencv从灰度转换为彩色(粘性)后添加彩色线条



我有以下问题。我需要导入灰度图像,并在图像的不同位置添加一些彩色线条(首选颜色是红色或蓝色,因为它们是可见的)我想把照片转换成rgb,然后添加线条。转换前形状为2d数组,转换后形状为3d

我的问题是

  • 如果我使用脚本独立执行此操作,我将获得没有任何问题的彩色线
  • 如果我把它集成到这个脚本。然而,无论我做什么,线条要么是黑色要么是白色(我尝试了不同的颜色),我特别检查了,当发射形状仍然是一个3d数组

这个脚本的目的是根据频率显示不同的图像。当获得图像时,我们添加某些彩色线条,然后显示它们。为了简单起见,我只是一遍又一遍地发送相同的图像。灰度图像在视觉上应保持相同的特征。唯一的彩色像素是添加的行。

我一直认为在显示图像时粘度有问题。因为如果我们只对cv2这样做,我们会得到正确的颜色。

import sys
from PySide2 import QtWidgets, QtCore
from vispy import scene
from PySide2.QtCore import QMetaObject
from PySide2.QtWidgets import *
import numpy as np
import time
import imageio as iio
import cv2
class CameraThread(QtCore.QThread):
new_image = QtCore.Signal(object)
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def run(self):
try:
while True:
frame = iio.imread(my_image)
print("shape before conversion: ", frame.data.shape)
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
print("shape after conversion: ", frame.data.shape)
cv2.line(frame, pt1=(100, 300), pt2=(400, 300), color=(255, 0, 0), thickness=10)
self.new_image.emit(frame.data)
time.sleep(3.0)
except Exception as e:
print(f"problem: {e}")
finally:
print('end!')

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 400)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.groupBox = QGroupBox(self.centralwidget)
self.groupBox.setObjectName("groupBox")
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
QMetaObject.connectSlotsByName(MainWindow)

class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# OpenGL drawing surface
self.canvas = scene.SceneCanvas(keys='interactive')
self.canvas.create_native()
self.canvas.native.setParent(self)

self.setWindowTitle('MyApp')

self.view = self.canvas.central_widget.add_view()
self.view.bgcolor = '#ffffff'   # set the canvas to a white background
self.image = scene.visuals.Image(np.zeros((1, 1, 1)),
interpolation='nearest',
parent= self.view.scene,
cmap='grays',
clim=(0, 2 ** 8 - 1))

self.view.camera = scene.PanZoomCamera(aspect=1)
self.view.camera.flip = (0, 1, 0)
self.view.camera.set_range()
self.view.camera.zoom(1000, (0, 0))
self._camera_runner = CameraThread(parent=self)
self._camera_runner.new_image.connect(self.new_image, type=QtCore.Qt.BlockingQueuedConnection)
self._camera_runner.start()

@QtCore.Slot(object)
def new_image(self, img):
try:
print("shape when emitting: ", img.shape)
self.image.set_data(img)
self.image.update()
except Exception as e:
print(f"problem sending image: {e}")
def main():
import ctypes
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID('my_gui')
app = QtWidgets.QApplication([])
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()

我在vispy论坛上找到了答案。给感兴趣的人整个问题都在图像

的初始化中。需要输入正确的参数np.zeros(1, 1, 3)

如果它从一开始就为false,它将永远不会自动更新。

最新更新