将文件中两段代码结合成一个整体代码
时间: 2024-12-18 16:24:02 浏览: 5
c语言学习 示例 代码 基础 分类
要将两个代码片段合并为一个完整的代码,可以按照以下步骤进行:
1. **整合类和函数**:将 `CamShow` 类与 `main` 函数中的逻辑结合起来。
2. **添加新鲜度预测功能**:在 `CamShow` 类中添加新鲜度预测的功能,并将其结果显示在界面上。
3. **处理视频捕获和显示**:确保视频捕获和显示逻辑正确集成。
以下是整合后的完整代码:
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton
from PyQt5.QtCore import QTimer, QCoreApplication
from PyQt5.QtGui import QPixmap, QImage
import cv2
import qimage2ndarray
import sys
import time
def predict_freshness(frame, fruit_type):
# 这里是新鲜度预测的逻辑,可以根据实际需求实现
# 示例返回固定的新鲜度状态
return "fresh"
class CamShow(QMainWindow):
def __del__(self):
try:
self.camera.release() # 释放资源
except:
return
def __init__(self, parent=None):
super(CamShow, self).__init__(parent)
self.fruit_type = "banana" # 替换为实际检测到的水果类型
self.setupUi()
self.PrepCamera()
self.CallBackFunctions()
self.Timer = QTimer()
self.Timer.timeout.connect(self.TimerOutFun)
def setupUi(self):
self.setWindowTitle("Camera Show")
self.setGeometry(100, 100, 800, 600)
self.DispLb = QLabel(self)
self.DispLb.setGeometry(20, 20, 640, 480)
self.ShowBt = QPushButton("Start", self)
self.ShowBt.setGeometry(680, 50, 100, 30)
self.StopBt = QPushButton("Pause", self)
self.StopBt.setGeometry(680, 100, 100, 30)
self.StopBt.setEnabled(False)
self.RecordBt = QPushButton("Record", self)
self.RecordBt.setGeometry(680, 150, 100, 30)
self.RecordBt.setEnabled(False)
self.ExitBt = QPushButton("Exit", self)
self.ExitBt.setGeometry(680, 200, 100, 30)
def PrepCamera(self):
try:
self.camera = cv2.VideoCapture(0)
except Exception as e:
print(str(e))
def StartCamera(self):
self.ShowBt.setEnabled(False)
self.StopBt.setEnabled(True)
self.RecordBt.setEnabled(True)
self.Timer.start(1)
self.timelb = time.perf_counter()
def StopCamera(self):
if self.StopBt.text() == 'Pause':
self.StopBt.setText('Resume')
self.RecordBt.setText('Save')
self.Timer.stop()
elif self.StopBt.text() == 'Resume':
self.StopBt.setText('Pause')
self.RecordBt.setText('Record')
self.Timer.start(1)
def RecordCamera(self):
tag = self.RecordBt.text()
if tag == 'Save':
try:
image_name = 'image_' + time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + '.jpg'
cv2.imwrite(image_name, self.Image)
print('Image saved.')
except Exception as e:
print(str(e))
elif tag == 'Record':
self.RecordBt.setText('Stop')
video_name = 'video_' + time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + '.avi'
fps = 20 # 设置适当的帧率
size = (self.Image.shape[1], self.Image.shape[0])
fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
self.video_writer = cv2.VideoWriter(video_name, fourcc, fps, size)
self.RecordFlag = 1
self.StopBt.setEnabled(False)
self.ExitBt.setEnabled(False)
elif tag == 'Stop':
self.RecordBt.setText('Record')
self.video_writer.release()
self.RecordFlag = 0
print('Video saved.')
self.StopBt.setEnabled(True)
self.ExitBt.setEnabled(True)
def TimerOutFun(self):
success, img = self.camera.read()
if success:
self.Image = img
predicted_state = predict_freshness(img, self.fruit_type)
if predicted_state is not None:
cv2.putText(img, f"Freshness: {predicted_state}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
self.DispImg()
if self.RecordFlag:
self.video_writer.write(img)
else:
print('Image obtaining failed.')
def DispImg(self):
img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2RGB)
qimg = QImage(img.data, img.shape[1], img.shape[0], QImage.Format_RGB888)
self.DispLb.setPixmap(QPixmap.fromImage(qimg))
self.DispLb.show()
def CallBackFunctions(self):
self.ShowBt.clicked.connect(self.StartCamera)
self.StopBt.clicked.connect(self.StopCamera)
self.RecordBt.clicked.connect(self.RecordCamera)
self.ExitBt.clicked.connect(self.ExitApp)
def ExitApp(self):
self.Timer.stop()
self.camera.release()
print('Exiting the application..')
QCoreApplication.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = CamShow()
ui.show()
sys.exit(app.exec_())
```
### 主要改动点:
1. **添加了 `predict_freshness` 函数**:用于预测水果的新鲜度状态。
2. **在 `TimerOutFun` 方法中调用 `predict_freshness`**:获取新鲜度状态并将其显示在图像上。
3. **调整了 `DispImg` 方法**:使用 `QImage` 和 `QPixmap` 显示图像。
这样,整个程序就可以在一个窗口中启动摄像头,显示视频流,并在图像上显示新鲜度预测结果。同时,还可以进行录制和保存操作。
阅读全文