/************************************************************************/
/* qt-opencv-multithreaded: */
/* A multithreaded OpenCV application using the Qt framework. */
/* */
/* MainWindow.cpp */
/* */
/* Nick D'Ademo <nickdademo@gmail.com> */
/* */
/* Copyright (c) 2011 Nick D'Ademo */
/* */
/* Permission is hereby granted, free of charge, to any person */
/* obtaining a copy of this software and associated documentation */
/* files (the "Software"), to deal in the Software without restriction, */
/* including without limitation the rights to use, copy, modify, merge, */
/* publish, distribute, sublicense, and/or sell copies of the Software, */
/* and to permit persons to whom the Software is furnished to do so, */
/* subject to the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */
/* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS */
/* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN */
/* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN */
/* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */
/* SOFTWARE. */
/* */
/************************************************************************/
#include "CameraConnectDialog.h"
#include "ProcessingSettingsDialog.h"
#include "Controller.h"
#include "MainWindow.h"
// Qt header files
#include <QDebug>
// Configuration header file
#include "Config.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
// Setup user interface
setupUi(this);
// Create controller
controller = new Controller;
// Save application version in QString variable
appVersion=QUOTE(APP_VERSION);
// Create processingSettingsDialog
processingSettingsDialog = new ProcessingSettingsDialog(this);
// Initialize data structures
initializeProcessingFlagsStructure();
initializeTaskDataStructure();
// Enable/disable appropriate GUI items
setInitGUIState();
// Initialize GUI
initializeGUI();
// Connect signals to slots
signalSlotsInit();
// Initialize flag
isCameraConnected=false;
} // MainWindow constructor
MainWindow::~MainWindow()
{
// Check if camera is connected
if(isCameraConnected)
{
// Disconnect connections (4)
disconnect(controller->processingThread,SIGNAL(newFrame(QImage)),0,0);
disconnect(this,SIGNAL(newProcessingFlags(struct ProcessingFlags)),controller->processingThread,SLOT(updateProcessingFlags(struct ProcessingFlags)));
disconnect(this->processingSettingsDialog,SIGNAL(newProcessingSettings(struct ProcessingSettings)),controller->processingThread,SLOT(updateProcessingSettings(struct ProcessingSettings)));
disconnect(this,SIGNAL(newTaskData(struct TaskData)),controller->processingThread,SLOT(updateTaskData(struct TaskData)));
// Stop processing thread
if(controller->processingThread->isRunning())
controller->stopProcessingThread();
// Stop capture thread
if(controller->captureThread->isRunning())
controller->stopCaptureThread();
// Clear image buffer
controller->clearImageBuffer();
// Check if threads have stopped
if((controller->captureThread->isFinished())&&(controller->processingThread->isFinished()))
{
// Disconnect camera
controller->disconnectCamera();
// Delete threads
controller->deleteCaptureThread();
controller->deleteProcessingThread();
// Delete image buffer
controller->deleteImageBuffer();
}
}
} // MainWindow destructor
void MainWindow::connectToCamera()
{
// Create dialog
cameraConnectDialog = new CameraConnectDialog(this);
// PROMPT USER:
// If user presses OK button on dialog, connect to camera; else do nothing
if(cameraConnectDialog->exec()==1)
{
// Set private member variables in cameraConnectDialog to values in dialog
cameraConnectDialog->setDeviceNumber();
cameraConnectDialog->setImageBufferSize();
// Store image buffer size in local variable
imageBufferSize=cameraConnectDialog->getImageBufferSize();
// Store device number in local variable
deviceNumber=cameraConnectDialog->getDeviceNumber();
// Connect to camera
if((isCameraConnected=controller->connectToCamera(deviceNumber,imageBufferSize)))
{
// Create connection between processing thread (emitter) and GUI thread (receiver/listener)
connect(controller->processingThread,SIGNAL(newFrame(QImage)),this,SLOT(updateFrame(QImage)),Qt::UniqueConnection);
// Create connections (3) between GUI thread (emitter) and processing thread (receiver/listener)
qRegisterMetaType<struct ProcessingFlags>("ProcessingFlags");
connect(this,SIGNAL(newProcessingFlags(struct ProcessingFlags)),controller->processingThread,SLOT(updateProcessingFlags(struct ProcessingFlags)),Qt::UniqueConnection);
qRegisterMetaType<struct ProcessingSettings>("ProcessingSettings");
connect(this->processingSettingsDialog,SIGNAL(newProcessingSettings(struct ProcessingSettings)),controller->processingThread,SLOT(updateProcessingSettings(struct ProcessingSettings)),Qt::UniqueConnection);
qRegisterMetaType<struct TaskData>("TaskData");
connect(this,SIGNAL(newTaskData(struct TaskData)),controller->processingThread,SLOT(updateTaskData(struct TaskData)),Qt::UniqueConnection);
// Set data to defaults in processingThread
emit newProcessingFlags(processingFlags);
emit newTaskData(taskData);
processingSettingsDialog->resetAllDialogToDefaults();
processingSettingsDialog->updateStoredSettingsFromDialog();
// Setup imageBufferBar in main window with minimum and maximum values
imageBufferBar->setMinimum(0);
imageBufferBar->setMaximum(imageBufferSize);
// Enable/disable appropriate menu items
connectToCameraAction->setDisabled(true);
disconnectCameraAction->setDisabled(false);
processingMenu->setDisabled(false);
// Enable "Clear Image Buffer" push button in main window
clearImageBufferButton->setDisabled(false);
// Get input stream properties
sourceWidth=controller->captureThread->getInputSourceWidth();
sourceHeight=controller->captureThread->getInputSourceHeight();
// Set text in labels in main window
deviceNumberLabel->setNum(deviceNumber);
cameraResolutionLabel->setText(QString::number(sourceWidth)+QString("x")+QString::number(sourceHeight));
/*
QThread::IdlePriority 0 scheduled only when no other threads are running
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
QT 和OpenCV 的多线程框架 支持灰度化,光滑,腐蚀,边缘检测,翻转等功能。。。 google code:http://code.google.com/p/qt-opencv-multithreaded/ 需要安装QT,我的版本是4.6.2 下载OpenCV 我的版本是2.3
资源推荐
资源详情
资源评论
收起资源包目录
qcvMT.rar (36个子文件)
MainWindow.h 4KB
Config.h 3KB
ImageBuffer.h 3KB
ProcessingSettingsDialog.cpp 18KB
CameraConnectDialog.cpp 5KB
Controller.cpp 4KB
CameraConnectDialog.h 3KB
MatToQImage.h 3KB
Resources
MainWindow.ui 21KB
FrameLabel.cpp 5KB
ProcessingSettingsDialog.ui 42KB
GeneratedFiles
Release
ui_qcvmt.h 2KB
Debug
moc_ProcessingThread.cpp 3KB
moc_Controller.cpp 2KB
moc_FrameLabel.cpp 3KB
moc_CameraConnectDialog.cpp 2KB
moc_ProcessingSettingsDialog.cpp 4KB
moc_MainWindow.cpp 5KB
moc_CaptureThread.cpp 2KB
ui_CameraConnectDialog.h 7KB
ui_MainWindow.h 21KB
ui_ProcessingSettingsDialog.h 37KB
qcvMT.vcproj 28KB
ImageBuffer.cpp 5KB
CaptureThread.h 3KB
CaptureThread.cpp 5KB
CameraConnectDialog.ui 6KB
ProcessingThread.h 4KB
MainWindow.cpp 21KB
ProcessingSettingsDialog.h 3KB
main.cpp 3KB
ProcessingThread.cpp 12KB
FrameLabel.h 3KB
MatToQImage.cpp 3KB
Controller.h 3KB
Structures.h 3KB
共 36 条
- 1
ryfdizuo
- 粉丝: 1319
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页