Qt入门(计算机视觉作业为例)

Qt入门(计算机视觉作业为例)

  • 作业描述
    必做:彩色图像灰度化处理; 灰度直方图;
    选做:灰度图像的伪彩图像;

  • 实现环境
    VS2015+Qt5.7.0

  • 新建项目
    在这里插入图片描述然后一路Finish

建好工程后进行环境变量配置:
包含目录添加:

C:\Qt\Qt5.7.0\5.7\msvc2015_64\include
D:\opencv\build\include
D:\opencv\build\include\opencv
D:\opencv\build\include\opencv2

库目录添加:

C:\Qt\Qt5.7.0\5.7\msvc2015_64\lib
D:\opencv\build\x64\vc14\lib

预处理器内容:
UNICODE
WIN32
QT_DLL
QT_CORE_LIB
QT_GUI_LIB
QT_WIDGETS_LIB
_DEBUG

附加依赖项:
qtmaind.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
opencv_world330d.lib(手动添加)

  • 实现过程
    因为不会用Qt,所以现在VS里写了三个函数分别实现功能,再考虑界面设计;
  • 代码
    对以上文件编写week1_qt.ui
    在这里插入图片描述week1_qt.h
#ifndef WEEK1_QT_H
#define WEEK1_QT_H
#include <QtWidgets/QMainWindow>
#include "ui_week1_qt.h"
#include <opencv2/opencv.hpp> 
#include <QImage>
#include <QPixmap>
#include <QFileDialog>
#include <QMessageBox>
#include <QScreen>
#include <QGuiApplication>
#include<QGraphicsScene>  
#include<QGraphicsView>                   //graphicsview类
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明
#include <qfiledialog.h>                //getopenfilename 类申明
#include <qlabel.h>  

//QT_CHARTS_USE_NAMESPACE
class week1_qt : public QMainWindow
{
	Q_OBJECT
public:
	week1_qt(QWidget *parent = 0);
	~week1_qt();
	//自定义变量
	cv::Mat src;
	//自定义其他函数
private:
	Ui::week1_qtClass ui;
	//自定义变量
	cv::Mat image;
    QLabel *label = new QLabel;
//信号函数
signals:
//槽函数
private slots:
    void pushButton_1_clicked();
    void pushButton_2_clicked();
	void pushButton_3_clicked();
	void pushButton_4_clicked();
	void pushButton_5_clicked();
};
#endif // WEEK1_QT_H

main.cpp

#include "week1_qt.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	week1_qt w;
	w.show();
	return a.exec();
}

week1_qt.cpp

#include "week1_qt.h"
#include <QMainWindow>
#include <QtGui>
#include <QtWidgets>

//#pragma execution_character_set("utf-8")    // 解决汉字乱码问题,注意!!!

using namespace std;
using namespace cv;

//主函数
week1_qt::week1_qt(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
}

week1_qt::~week1_qt()
{
	
}
//普通函数
//彩色图像灰度化处理(采用加权法)
Mat RGB2GRAY(Mat src)
{
	if (src.channels() == 1)
	{
		return src;
	}
	else if (src.channels() == 3 || src.channels() == 4)//第四通道表示透明度
	{
		//参数及初始化
		Mat dst(src.rows, src.cols, CV_8UC1, Scalar(255));
		double B, G, R;
		B = 0.114;
		G = 0.587;
		R = 0.299;
		int b_val, g_val, r_val;
		//赋值
		for (int i = 0; i < src.rows; i++)
		{
			for (int j = 0; j < src.cols; j++)
			{
				b_val = src.at<Vec3b>(i, j)[0];
				g_val = src.at<Vec3b>(i, j)[1];
				r_val = src.at<Vec3b>(i, j)[2];
				dst.at<uchar>(i, j) = saturate_cast<uchar>(B*b_val + G*g_val + R*r_val);
			}
		}
		return dst;
	}
	else
	{
		throw "error";
	}
	//cvtColor(src, dst, COLOR_BGR2GRAY, 0);
}
//灰度直方图(灰度图,彩图)
Mat Histogram(Mat src)
{
	//灰度图
	if (src.channels() == 1)
	{
		//参数准备
		Mat dstHist;
		int channels = 0;
		int dims = 1;
		int Num = 256;
		int size[] = { Num };
		float hranges[] = { 0,255 };
		const float *ranges[] = { hranges };
		//计算图像直方图
		calcHist(&src, 1, &channels, Mat(), dstHist, dims, size, ranges);
		int scale = 1;
		Mat dst(Num * scale, Num, CV_8U, Scalar(0));
		//获取最大值和最小值
		double minValue = 0;
		double maxValue = 0;
		minMaxLoc(dstHist, &minValue, &maxValue, 0, 0);
		//绘制出直方图
		int hpt = saturate_cast<int>(0.9 * Num);
		for (int i = 0; i < Num; i++)
		{
			float binValue = dstHist.at<float>(i);
			int realValue = saturate_cast<int>(binValue * hpt / maxValue);
			rectangle(dst, Point(i * scale, Num - 1), Point((i + 1)*scale - 1, Num - realValue), Scalar(255));
		}
		return dst;
	}
	else if (src.channels() == 3 || src.channels() == 4)
	{
		//参数准备
		int bins = 256;
		int hist_size[] = { bins };
		float range[] = { 0, 256 };
		const float* ranges[] = { range };
		Mat redHist, grayHist, blueHist;
		//直方图计算(红色部分)
		int channels_r[] = { 0 };
		calcHist(&src, 1, channels_r, Mat(), redHist, 1, hist_size, ranges);
		//直方图计算(绿色部分)
		int channels_g[] = { 1 };
		calcHist(&src, 1, channels_g, Mat(), grayHist, 1, hist_size, ranges);
		//直方图计算(蓝色部分)
		int channels_b[] = { 2 };
		calcHist(&src, 1, channels_b, Mat(), blueHist, 1, hist_size, ranges);
		//绘制三色直方图
		//1、参数准备
		double maxValue_red, maxValue_green, maxValue_blue;
		minMaxLoc(redHist, 0, &maxValue_red, 0, 0);
		minMaxLoc(grayHist, 0, &maxValue_green, 0, 0);
		minMaxLoc(blueHist, 0, &maxValue_blue, 0, 0);
		int scale = 1;
		int histHeight = 256;
		Mat dst = Mat::zeros(histHeight, bins * 3, CV_8UC3);
		//2、正式绘制
		for (int i = 0; i<bins; i++)
		{
			//参数准备
			float binValue_red = redHist.at<float>(i);
			float binValue_green = grayHist.at<float>(i);
			float binValue_blue = blueHist.at<float>(i);
			int intensity_red = cvRound(binValue_red*histHeight / maxValue_red);  //要绘制的高度
			int intensity_green = cvRound(binValue_green*histHeight / maxValue_green);  //要绘制的高度
			int intensity_blue = cvRound(binValue_blue*histHeight / maxValue_blue);  //要绘制的高度
			//绘制红色分量的直方图
			rectangle(dst, Point(i*scale, histHeight - 1), Point((i + 1)*scale - 1, histHeight - intensity_red), Scalar(255, 0, 0));
			//绘制绿色分量的直方图
			rectangle(dst, Point((i + bins)*scale, histHeight - 1), Point((i + bins + 1)*scale - 1, histHeight - intensity_green), Scalar(0, 255, 0));
			//绘制蓝色分量的直方图
			rectangle(dst, Point((i + bins * 2)*scale, histHeight - 1), Point((i + bins * 2 + 1)*scale - 1, histHeight - intensity_blue), Scalar(0, 0, 255));
		}
		return dst;
	}
	else
	{
		throw "error";
	}
}
//灰度图像的伪彩图像
Mat GRAY2RGB(Mat src)
{
	if (src.channels() == 1)
	{
		//参数初始化
		Mat dst(src.rows, src.cols, CV_8UC3, Scalar(0, 0, 0));
		uchar r_val, g_val, b_val;
		uchar gray_val;
		//色彩转换
		for (int i = 0; i < src.rows; i++)
		{
			for (int j = 0; j < src.cols; j++)
			{
				gray_val = src.at<uchar>(i, j);
				//计算RGB通道像素值
				if ((gray_val >= 0) && (gray_val <= 63))
				{
					r_val = 0;
					g_val = saturate_cast<uchar>(254 - 4 * gray_val);
					b_val = 255;
				}
				else if ((gray_val >= 64) && (gray_val <= 127))
				{
					r_val = 0;
					g_val = saturate_cast<uchar>(4 * gray_val - 254);
					b_val = saturate_cast<uchar>(510 - 4 * gray_val);
				}
				else if ((gray_val >= 128) && (gray_val <= 191))
				{
					r_val = saturate_cast<uchar>(4 * gray_val - 510);
					g_val = 255;
					b_val = 0;
				}
				else if ((gray_val >= 192) && (gray_val <= 255))
				{
					r_val = 255;
					g_val = saturate_cast<uchar>(1022 - 4 * gray_val);
					b_val = 0;
				}
				else
				{
					throw "red error";
				}
				//赋值
				dst.at<Vec3b>(i, j)[2] = r_val;
				dst.at<Vec3b>(i, j)[1] = g_val;
				dst.at<Vec3b>(i, j)[0] = b_val;
			}
		}
		return dst;
	}
	else if (src.channels() == 3 || src.channels() == 4)
	{
		return src;
	}
	else
	{
		throw "error";
	}
}
//信号与槽函数
//槽函数
//读入图片
void week1_qt::pushButton_1_clicked()         
{
	QString fileName = QFileDialog::getOpenFileName(this, tr("File Dialog"), "E:", tr("pic file(* png * jpg * bmp)"));
	//判断是否有选择文件
	if ("" == fileName) return;
	//读取文件,并把QString类型转化为string
	src = imread(string((const char *)fileName.toLocal8Bit()));
	//显示图片
	imshow("原图", src);
	waitKey(0);
}
//灰度图
void week1_qt::pushButton_2_clicked()
{
	Mat dst1 = RGB2GRAY(src);
	imshow("灰度图", dst1);
}
//直方图
void week1_qt::pushButton_3_clicked()
{
	Mat dst2 = Histogram(src);
	imshow("彩色直方图", dst2);
	Mat dst3 = Histogram(RGB2GRAY(src));
	imshow("灰度直方图", dst3);
	waitKey(0);
}
//伪彩图
void week1_qt::pushButton_4_clicked()
{
	Mat dst4 = GRAY2RGB(RGB2GRAY(src));
	imshow("伪彩图", dst4);
}

void week1_qt::pushButton_5_clicked()
{
	Mat dst1 = RGB2GRAY(src);
	Mat dst2 = Histogram(src);
	Mat dst3 = Histogram(RGB2GRAY(src));
	Mat dst4 = GRAY2RGB(RGB2GRAY(src));
	imwrite("原图.jpg", src);
	imwrite("灰度图.jpg", dst1);
	imwrite("彩图直方图.jpg", dst2);
	imwrite("灰度直方图.jpg", dst3);
	imwrite("灰度伪彩图.jpg", dst4);
}

自定义的槽函数要在.ui文件中添加进去:
在这里插入图片描述在这里插入图片描述如果槽函数按照系统给定的方式命名,则会出现触发两次按钮的情况,因为该按钮会自动连接系统命名的槽函数,我们再添加的话相当于又连接一次(自动命名规则:例如on_QPushButton_clicked)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值