opencv 用户交互窗口添加按钮

跟着《OpenCV By Example》学到了第三章节,自己用的windows10+VS2017+OpenCV3.3.1

看到了交互界面添加按钮的代码,本以为代码不需要Qt,结果运行时报错:

OpenCV Error: The function/feature is not implemented (The library is compiled without QT support) in cv::createButton, file

代码如下:

#include <iostream>
#include <string>
#include <sstream>
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

using namespace cv;
using namespace std;

Mat img;
bool applyGray = false;
bool applyBlur = false;
bool applySobel = false;


void grayCallback(int state, void* userData);
void bgrCallback(int state, void* userData);
void blurCallback(int state, void* userData);
void sobelCallback(int state, void* userData);
void applyFilters();

int main()
{
	img = imread("1.jpg");

	namedWindow("img");

	createButton("Blur", blurCallback, NULL, QT_CHECKBOX, 0);

	createButton("Gray", grayCallback, NULL, QT_RADIOBOX, 0);
	createButton("RGB", bgrCallback, NULL, QT_RADIOBOX, 1);

	createButton("Sobel", sobelCallback, NULL, QT_PUSH_BUTTON, 0);

	waitKey(0);
	destroyAllWindows();

	return 0;
}


void grayCallback(int state, void* userData)
{
	applyGray = true;
	applyFilters();
}

void bgrCallback(int state, void* userData)
{
	applyGray = false;
	applyFilters();
}

void blurCallback(int state, void* userData)
{
	applyBlur = (bool)state;
	applyFilters();
}
void sobelCallback(int state, void* userData)
{
	applySobel = !applySobel;
	applyFilters();
}

void applyFilters()
{
	Mat result;
	img.copyTo(result);
	if (applyGray)
	{
		cvtColor(result, result, COLOR_BGR2GRAY);
	}
	if (applyBlur)
	{
		blur(result, result, Size(5, 5));
	}
	if (applySobel)
	{
		Sobel(result, result, CV_8U, 1, 1);
	}
	imshow("img", img);
}



  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Qt 是一种流行的跨平台应用程序开发框架,而 OpenCV 是一个开放源代码的计算机视觉库。在 Qt 中展示 OpenCV 的图像是一个常见的任务。 要在 Qt 中展示 OpenCV 的图像,我们首先需要创建一个 Qt 的图像显示窗口。可以使用 Qt 的 QGraphicsView 组件实现这一目的。此外,还需要将 OpenCV 的图像数据转换为 Qt 的图像数据格式,然后将其加载到 QGraphicsView 组件中。 首先,我们需要使用 OpenCV 的函数加载图像文件,如 cv::imread()。然后,我们将 OpenCV 的图像数据转换为 Qt 的图像数据格式,可以使用 QImage 类来完成这一任务。QImage 类提供了一些静态成员函数,例如 fromData() 或 fromPixmap(),可以将 OpenCV 的图像数据转换为 Qt 的图像数据格式。 一旦将 OpenCV 的图像数据转换为 Qt 的图像数据格式,我们可以将其加载到 QGraphicsView 组件中。通过在 QGraphicsScene 上添加一个 QGraphicsPixmapItem 对象,然后将转换后的图像数据传递给该对象的 setPixmap() 函数,可以实现这一目标。 最后,我们还需要将 QGraphicsView 组件添加到主窗口或其他适当的位置,以便用户可以看到展示的图像。可以使用 Qt 的 QWidget 或 QMainWindow 来创建主窗口,然后将 QGraphicsView 组件添加到该窗口中。 综上所述,Qt 中展示 OpenCV 的图像可以通过将 OpenCV 的图像数据转换为 Qt 的图像数据格式,并将其加载到 QGraphicsView 组件中实现。这样,用户就可以在 Qt 的窗口中看到 OpenCV 处理后的图像了。 ### 回答2: Qt 是一个跨平台的 C++ 图形用户界面开发框架,而 OpenCV 是一个用于图像处理和计算机视觉的开源库。两者可以结合使用来实现图像的显示和处理。 Qt 提供了一个名为 QGraphicsView 的类,它可以用于在窗口中显示图像。为了在 Qt 中显示 OpenCV 的图像,我们可以将 OpenCV 的图像转换为 Qt 支持的格式,如 QPixmap 或 QImage。 具体的步骤如下: 1. 首先,我们需要导入必要的头文件:#include <QtGui/QtGui>,#include <opencv2/opencv.hpp>。 2. 然后,加载 OpenCV 的图像文件:cv::Mat image = cv::imread("image.jpg")。 3. 接下来,将 OpenCV 的图像转换为 Qt 支持的格式(QImage 或 QPixmap):QImage img = QImage(image.data, image.cols, image.rows, QImage::Format_RGB888) 或 QPixmap pixmap = QPixmap::fromImage(img)。 4. 创建一个 QGraphicsScene 对象,将转换后的图像添加到场景中:QGraphicsScene scene; scene.addPixmap(pixmap)。 5. 最后,创建一个 QGraphicsView 对象,并将场景设置为视图的场景:QGraphicsView view; view.setScene(&scene)。 通过以上步骤,我们就可以在 Qt 窗口中显示 OpenCV 的图像了。当然,还可以结合其他 Qt 的功能,如按钮、滑动条等,来实现图像的交互和处理。 ### 回答3: Qt中可以使用OpenCV库进行图像的显示和处理。在Qt中显示OpenCV图像有两种方式,一种是通过将OpenCV图像转换为Qt的图像类(QImage)再显示,另一种是直接在Qt的窗口控件中显示OpenCV图像。 第一种方式,可以通过将OpenCV图像转换为Qt的图像类(QImage)再显示。首先,将OpenCV图像的格式转换为Qt可以接受的格式,可以使用cv::cvtColor函数将OpenCV图像从BGR格式转换为RGB格式。然后,使用QImage的构造函数将OpenCV图像数据作为参数传入,创建Qt的图像对象。最后,将Qt的图像对象显示在Qt的窗口控件中,可以使用QLabel或QGraphicsView等控件进行显示。 第二种方式,可以直接在Qt的窗口控件中显示OpenCV图像。首先,创建一个Qt的窗口控件,例如QWidget或QGraphicsView等。然后,将OpenCV图像的数据传入到Qt的窗口控件中,可以将OpenCV图像数据的指针传入到Qt的窗口控件中,或者将OpenCV图像的指针包装为Qt的图像类(QImage)再传入。最后,刷新窗口控件以显示OpenCV图像。 除了显示OpenCV图像,Qt还可以与OpenCV一起进行图像的处理。可以使用Qt提供的绘图函数进行图像的绘制,也可以使用OpenCV提供的图像处理函数对图像进行处理。Qt和OpenCV都有丰富的图像处理函数和算法,可以根据需求选择合适的函数进行图像处理。 综上所述,Qt可以通过将OpenCV图像转换为Qt的图像类(QImage)再显示,或者直接在Qt的窗口控件中显示OpenCV图像,同时还可以与OpenCV一起进行图像的处理。这样可以充分发挥Qt和OpenCV的优势,实现图像处理和显示的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值