QT5.12+opencv4.0.1 Cielab空间 像素颜色信息
QT5.12+opencv4.0.1 Cielab空间 鼠标点击获取像素颜色信息
opencv路径配置
使用vs2015编译,而非Cmake,只需 加入bin文件的路径:右击计算机>>系统属性>>高级>>环境变量>>path 添加opencv bin文件的路径;
在qt项目的pro文件中链接库,添加以下代码(路径因人而异,看一下include和lib文件夹的位置),库添加要用的就行。
INCLUDEPATH+=F:/install/include \
F:/install/include/opencv2
LIBS+=-LF:/install/x64/vc14/lib \
-lopencv_calib3d401d \
-lopencv_core401d \
-lopencv_dnn401d \
-lopencv_features2d401d \
-lopencv_flann401d \
-lopencv_gapi401d \
-lopencv_highgui401d \
-lopencv_imgcodecs401d \
-lopencv_imgproc401d \
-lopencv_objdetect401d \
-lopencv_photo401d \
-lopencv_stitching401d \
-lopencv_video401d \
-lopencv_videoio401d \
使用摄像头以及色彩转换
主要功能:鼠标点击图片,返回当前位置的lab的值。主要是有些懒,不想一张张图测试,找了个摄像头隔几秒拍一帧,看看各部分的lab值;
基本思路是:启用摄像头>转换将当前帧>转换到Cielab空间>启用鼠标回调函数
使用循环,每两秒拍一张,更改waitkey()数值可以等待更久;
main函数:
int main(int argc, char *argv[])
{
Mat frame,tran,test;
Point p;
int i=0;
VideoCapture cap(1);
cap.set(CAP_PROP_FRAME_HEIGHT, 240); //1920*1080 1024*768 320*240
cap.set(CAP_PROP_FRAME_WIDTH, 640);
while(i!=40)
{
cap>>frame;
frame.convertTo(test, CV_32FC3, 1.0 / 255, 0);
imshow("orign",test);
tran=Mat::zeros(test.size(),CV_32FC3);
cvtColor(test,tran,COLOR_BGR2Lab);
setMouseCallback("display",my_mouse_callback,(void*)&tran);
imshow("display",tran);
waitKey(2000);
i++;
}
return 0;
}
鼠标回调函数:
鼠标左键点击后,会将当前像素的l,a,b值输出,以及当前位置;
void my_mouse_callback(int event,int x, int y, int flags, void *ptr)
{
Mat m_pic;
m_pic=*(Mat*)ptr;
Point p(x,y);
switch (event)
{
case EVENT_LBUTTONDOWN:
{
cout<<"l="<<m_pic.at<Vec3f>(p)[0]<<endl;
cout<<"a="<<m_pic.at<Vec3f>(p)[1]<<endl;
cout<<"b="<<m_pic.at<Vec3f>(p)[2]<<endl;
cout << "at(" << x << "," << y << ") "<< endl;
break;
}
default:
break;
}
}
包含头文件
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;
void my_mouse_callback(int event,int x, int y, int flags, void *ptr);
输出结果:
一些问题
输出的l,a,b值为浮点型,我觉得应该是整型才对,或者这个根本不是l,a,b的值,还是原来BGR空间的值。。。
新手上路,谢谢。
参考
https://blog.****.net/jiamuju84/article/details/52893239
https://stackoverflow.com/questions/15570431/opencv-return-value-from-mouse-callback-function