QT5.12+opencv4.0.1 Cielab空间 像素颜色信息

QT5.12+opencv4.0.1 Cielab空间 鼠标点击获取像素颜色信息

opencv路径配置

使用vs2015编译,而非Cmake,只需 加入bin文件的路径:右击计算机>>系统属性>>高级>>环境变量>>path 添加opencv bin文件的路径;

QT5.12+opencv4.0.1 Cielab空间 像素颜色信息
在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);

输出结果:
QT5.12+opencv4.0.1 Cielab空间 像素颜色信息

一些问题

输出的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