OpenCV使用QT GUI显示
效果
首先看结果:可以图片进行放大,缩小,还可以得到任意像素坐标和像素RGB而不需要任何额外的代码。
简要说明
想拥有这样的效果需要两个条件:
- 编译opencv时勾选USE_QT(确保GUI使用QT)
- 写程序时包含QT库
详细说明
opencv进行显示必须依赖一种可视化库,可以是VTK或GTK或QT。
我们最常见的是前两种,我们最常见的是这种:
但这种显示处理显示,并没有其他功能,如放大,缩小,取像素值等功能
今天我们要使用更为强大的功能较多的GUI-QTGUI配合我们更好的显示:
首先想要使用QTGUI,在opencv编译的时候要勾选“USE_QT”,当CMAKE在configure中显示:QT YES
说明我们使用了QT作为我们的GUI了。
其次,我们使用了QTGUI,那我们在写程序的时候一定要链接QT的库,不然程序不能进行显示。
实例1
最简单的opencv程序
cpp
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void main()
{
cout << CV_VERSION << endl;
Mat src = imread("../data/1.jpg");
imshow("img", src);
waitKey(0);//暂停按键等待
}
CMakeList:
cmake_minimum_required(VERSION 2.8.12)
project(cuda_sift)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
#find qt5
find_package(Qt5Core)
#find OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
实例2
下面是个示例:此例可以扩展窗口,注释掉的部分可以写按钮,加控制条,鼠标等事件。方便实验。
CPP:
#include <iostream>
#include <opencv2/highgui.hpp>
void callbackButton(int,void*)
{
std::cout<<"asd"<<std::endl;
}
void callbackButton1(int,void*)
{
std::cout<<"asd"<<std::endl;
}
void callbackButton2(int,void*)
{
std::cout<<"asd"<<std::endl;
}
void on_mouse(int a,int b ,int c,int d,void*)
{
//std::cout<<"asd"<<std::endl;
}
int main(int argc, char *argv[])
{
// int value = 50;
// int value2 = 0;
cvNamedWindow("main1",CV_WINDOW_NORMAL);
// cvNamedWindow("main2",CV_WINDOW_AUTOSIZE | CV_GUI_NORMAL);
// cvCreateTrackbar( "track1", "main1", &value, 255, NULL);//OK tested
// char* nameb1 = "button1";
// char* nameb2 = "button2";
// cvCreateButton(nameb1,callbackButton,nameb1,CV_CHECKBOX,1);
// cvCreateButton(nameb2,callbackButton,nameb2,CV_CHECKBOX,0);
// cvCreateTrackbar( "track2", NULL, &value2, 255, NULL);
// cvCreateButton("button5",callbackButton1,NULL,CV_RADIOBOX,0);
// cvCreateButton("button6",callbackButton2,NULL,CV_RADIOBOX,1);
// cvSetMouseCallback( "main2",on_mouse,NULL );
cv::Mat img1 = cv::imread("../data/lena.png");
cv::Mat img2(img1);
//`Esc` drop out
while(cvWaitKey(33) != 27)
{
cv::imshow("main1",img2);
}
cvDestroyAllWindows();
img1.release();
img2.release();
return 0;
}
CMakeList:
cmake_minimum_required(VERSION 2.8.12)
project(cuda_sift)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
#find qt5
find_package(Qt5Core)
#find OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})