可以,用PYQT+CV2,四個USB連接成功,程序如下,UI要自己搞了,放不下
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的和縣網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
# -*- coding: utf-8 -*-
import sys#, time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
from Ui_cv2ui_thread import Ui_MainWindow
import cv2 as cv
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import (QApplication, QDialog, QFileDialog, QGridLayout,
QLabel, QPushButton, QColorDialog)
import numpy as np
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
self.setupUi(self) #這個一定要在這個最前面位置
# define the slot for pushbutton to save the merged image
self.pushButton.clicked.connect(self.savemergeimage)
self.img = np.ndarray(()) #空的numpy array
self.img1 = np.ndarray(())
self.img2= np.ndarray(())
self.img3= np.ndarray(())
self.img4= np.ndarray(())
self.img4= np.empty([960,1280, 3], int)
self.cap = cv.VideoCapture(3) #注意,由大開到小,很重要
self.cap.set(3, 640) # setup the resolution of CCD
self.cap.set(4, 480)
ret, self.img=self.cap.read()
self.cap1 = cv.VideoCapture(2)
self.cap1.set(3, 640)
self.cap1.set(4, 480)
ret, self.img1=self.cap1.read()
self.cap2 = cv.VideoCapture(1)
self.cap2.set(3, 640)
self.cap2.set(4, 480)
ret, self.img2=self.cap2.read()
self.cap3 = cv.VideoCapture(0)
self.cap3.set(3, 640)
self.cap3.set(4, 480)
ret, self.img3=self.cap3.read()
#time.sleep(1)也許需要延遲,等他準(zhǔn)備好
# 初始化一個定時器,在其他條件下用的
#self.timer = QTimer(self)
# 實(shí)例化一個線程
self.work0= WorkThread()
self.work0.trigger.connect(self.ccd2)
# 定義時間任務(wù)是一次性任務(wù)就設(shè)定下一行
#self.timer.setSingleShot(True)
# 啟動時間任務(wù),注意一致性
self.work0.start()
# 實(shí)例化一個線程
self.work= WorkThread()
# 多線程的信號觸發(fā)連接到ccd3
self.work.trigger.connect(self.ccd3)
self.work.start()
# 實(shí)例化一個線程
self.work2 = WorkThread()
# 多線程的信號觸發(fā)連接到ccd4
self.work2.trigger.connect(self.ccd4)
self.work2.start()
# 實(shí)例化一個線程
self.work3 = WorkThread()
# 多線程的信號觸發(fā)連接到ccd1
self.work3.trigger.connect(self.ccdmerge)
self.work3.start()
self.work4 = WorkThread()
# 多線程的信號觸發(fā)連接到ccd1
self.work4.trigger.connect(self.ccd1)
self.work4.start()
def refreshShowa(self):#顯示ccd1到label1
# 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
height, width, channel = self.img.shape
bytesPerLine = 3 * width
self.qImg = QImage(self.img.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label.setPixmap(QPixmap.fromImage(self.qImg))
def refreshShowb(self):#顯示ccd2到label2
# 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
height, width, channel = self.img1.shape
bytesPerLine = 3 * width
self.qImg1 = QImage(self.img1.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_2.setPixmap(QPixmap.fromImage( self.qImg1))
def refreshShowc(self):#顯示ccd3到label3
# 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
height, width, channel = self.img2.shape
bytesPerLine = 3 * width
self.qImg2 = QImage(self.img2.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_3.setPixmap(QPixmap.fromImage( self.qImg2))
def refreshShowd(self):#顯示ccd4到label4
# 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
height, width, channel = self.img3.shape
bytesPerLine = 3 * width
self.qImg3 = QImage(self.img3.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_4.setPixmap(QPixmap.fromImage( self.qImg3))
def refreshShowe(self):#顯示合并的影像到label6
# 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
height, width, channel = self.img4.shape
bytesPerLine = 3 * width
self.qImg4 = QImage(self.img4.data, width, height, bytesPerLine,
QImage.Format_RGB888).rgbSwapped()
# 將Qimage顯示出來
self.label_6.setPixmap(QPixmap.fromImage( self.qImg4))
def ccd1(self):
self.cap.set(3, 640)
self.cap.set(4, 480)
ret, self.img = self.cap.read()
self.refreshShowa()
# 啟動另一個線程
self.work0.start()#注意一致性
def ccd2(self, str):
self.cap1.set(3, 640)
self.cap1.set(4, 480)
ret, self.img1 = self.cap1.read()
self.refreshShowb()
self.work.start()#注意一致性
def ccd3(self, str):
self.cap2.set(3, 640)
self.cap2.set(4, 480)
ret, self.img2= self.cap2.read()
self.refreshShowc()
self.work2.start()#注意一致性
def ccd4(self, str):
self.cap3.set(3, 640)
self.cap3.set(4, 480)
ret, self.img3 = self.cap3.read()
self.refreshShowd()
self.work3.start()#注意一致性
def ccdmerge(self, str):
self.img4=np.hstack((self.img, self.img1))
self.img4=np.vstack((self.img4, np.hstack((self.img2, self.img3))))
#print ('here is a merge process') 可以用來判斷多線程的執(zhí)行
self.refreshShowe() #later to remove the remark
self.work4.start()#注意一致性
def savemergeimage(self):
# 調(diào)用存儲文件dialog
fileName, tmp = QFileDialog.getSaveFileName(
self, 'Save Image', './__data', '*.png *.jpg *.bmp', '*.png')
if fileName == '':
return
if self.img.size == 1:
return
# 調(diào)用opencv寫入圖像
cv.imwrite(fileName,self.img4)
class WorkThread(QThread): #多線程核心,非常重要
# 定義一個信號
trigger = pyqtSignal(str)
def __int__(self):
# 初始化函數(shù),默認(rèn)
super(WorkThread, self).__init__()
def run(self):
self.trigger.emit('')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
def?cap_upper(lista):
for?i?in?xrange(len(lista)):
lista[i]=lista[i][0].upper()+lista[i][1:]
return?lista
aaa=['dog','cat']
print?cap_upper(aaa)
不過我記得有個首字母大寫函數(shù)capitalize(),直接循環(huán)調(diào)用這函數(shù)就行
CAP增加了對ADS和ELDO仿真器的支持,以與LSYNC V,I輸入一起用于DC,CV和兩個端口/多端口仿真。
更新的CMOS封裝:BSIMSOI模型已更新至版本4.6.0和4.6.1;HiSIM_HV模型已更新至版本2.40;HiSIM2模型已更新至版本3.0.0;PSP模型已更新至版本103.5和103.6
引入了新的Python API模塊,以通過以下python函數(shù)導(dǎo)入脈沖IV和S參數(shù)Maury / AMCAD輸出數(shù)據(jù)格式(.mes和.mps):load_mes_file_p_lsync;load_mes_file_iv_lsync;load_mps_file_p_lsync;load_mps_file_iv_lsync
引入了新的Python API函數(shù)以啟用外部Python模塊的重載:load_python_module
通過在IC-CAP主窗口級別添加變量ENABLE_DCOP_AND_LIB_IMPORT(系統(tǒng)變量),可以使用兩種實(shí)驗(yàn)功能。 它的價(jià)值并不重要,只需將其存在于最頂層即可啟用實(shí)驗(yàn)功能。靜壓箱和消聲器是兩種常見的空調(diào)裝置,在空調(diào)設(shè)計(jì)中經(jīng)常用到,這兩者外形相似,沒有什么本質(zhì)上的區(qū)分,功能側(cè)重稍有不同。
靜壓箱常見于空調(diào)機(jī)房內(nèi)部,接在風(fēng)機(jī)前后,空調(diào)機(jī)房內(nèi)部一般安裝空間有限,風(fēng)管轉(zhuǎn)彎或者分支三通的時候無法做標(biāo)準(zhǔn)的彎頭和三通,這種時候就可以設(shè)置一個靜壓箱。
如下圖中的空調(diào)機(jī)房送風(fēng)回風(fēng)靜壓箱。
靜壓箱可以把動壓轉(zhuǎn)換為靜壓,穩(wěn)定氣流和減少氣流波動,讓空氣吹得更遠(yuǎn)。
一般也會在靜壓箱內(nèi)部貼上消聲材料,兼顧消聲作用。
關(guān)于靜壓箱可以參考這個推文:
靜壓箱接線盒分集水器
消聲器主要作用就是消除噪音,比如下圖中的新風(fēng)掛機(jī)的出口的ZP系列消聲器。
里面也是貼的吸聲材料,達(dá)到消除噪音的目的,另外這個吸聲材料也兼具保溫功能,所以現(xiàn)場做的時候,對于這種空調(diào)風(fēng)管上用的消聲器外面可以不再單獨(dú)包保溫材料。
Revit自帶的族有這種風(fēng)管式消聲器的族,路徑:
C:\ProgramData\Autodesk\RVT 2018\Libraries\China\機(jī)電\風(fēng)管附件\消聲器
里面樣式挺多的,從消聲原理上大致分為抗性消聲器和阻性消聲器,有興趣可以找專業(yè)書籍查看原理。
自帶的消聲器族里面的參數(shù)都是類別參數(shù),你需要針對不同尺寸的風(fēng)管單獨(dú)設(shè)置族的參數(shù),用起來不是很方便,個人不是不用自帶族的。
我需要的是自動捕捉風(fēng)管的那種族,推薦嘗試我自己做的萬用族,可以自動捕捉風(fēng)管,其大小也都是實(shí)例參數(shù),設(shè)置起來非常便捷。
萬用族參考這個推文:
自帶風(fēng)機(jī)族不靈光,我做了一個萬用族
標(biāo)準(zhǔn)消聲器尺寸各邊比風(fēng)管大200mm左右,模型可以按200來考慮,施工現(xiàn)場做的時候,這個消聲器尺寸也可以定制,遇到空間受限的極限情況,還是要靈活處理,不要太死板。
map是一個高級函數(shù),第一個參數(shù)為函數(shù),第二個參數(shù)為可迭代對象(如列表,字符串等), 其作用就是把可迭代對象里的每個元素都應(yīng)用到第一個函數(shù)中
形象解釋:
map(f,?[x1,?x2,?...,?xn])?=?[f(x1),?f(x2),?f(x3),...,?f(xn)]
不加括號表示這個函數(shù),加了括號就是在調(diào)用這個函數(shù)并返回值了
舉個例子:
def?f():
return?1
print(f)
print(f())
輸出結(jié)果:
function f at 0x7fb59035f578
1
第一個打印的是函數(shù)及其內(nèi)存地址,第二個打印的是調(diào)用函數(shù)f后返回的值(也就是1)
所以說不能加括號
網(wǎng)站名稱:pythoncap函數(shù) python capi
網(wǎng)站網(wǎng)址:http://www.2m8n56k.cn/article28/dojiocp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、移動網(wǎng)站建設(shè)、定制網(wǎng)站、企業(yè)建站、ChatGPT、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)