上原图(街边拍摄,仅供学习使用):
上目标图:
想用VS2017写个阈值编辑器达到这种效果。
上效果图:
#include <iostream>
#include <opencv/cv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
//定义了窗体名
string winName = "Lab阈值编辑器";
trackbar的值
openmvide的值
//int posTrackBar = 0;
int L_minTrackBar = 71; // openmvide L是0->100, 要改成0 - 255
int L_maxTrackBar = 156;
int A_minTrackBar = 133;//openmvide A是-128->128,要改成0-255
int A_maxTrackBar = 143;
int B_minTrackBar = 65; //openmvide B是-128->128,要改成0-255
int B_maxTrackBar = 97;
本程序的值
//
//int L_minTrackBar = 87;
//int L_maxTrackBar = 222;
//int A_minTrackBar = 0;
//int A_maxTrackBar = 122;
//int B_minTrackBar = 0;
//int B_maxTrackBar = 26;
void callfirst(void* usrdata);
//TrackBar发生改变的回调函数
void onChangeTrackBar(int pos, void* userdata);
//主函数
int main()
{
//trackbar名
string trackBarName = "pos";
//图像文件名
string imgName = "6.jpg";
//trackbar的最大值
int maxValue = 255;
//读入图像,以灰度图形式读入
float scale=0.3;
Mat src = imread(imgName);
Size dsize = Size(src.cols * scale, src.rows * scale);
resize(src, src, dsize);
Mat src2Gray;
cvtColor(src, src2Gray, CV_BGR2GRAY);
Mat src2Lab;
//src.copyTo(src2Lab);
cvtColor(src, src2Lab, CV_BGR2Lab);
//新建窗口
namedWindow(winName);
imshow(winName, src2Gray);
//创建trackbar,我们把src作为数据传进回调函数中
callfirst(&src2Lab);
//createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackBar, &src2Gray);
createTrackbar("L_min", winName, &L_minTrackBar, maxValue, onChangeTrackBar, &src2Lab);
createTrackbar("L_max", winName, &L_maxTrackBar, maxValue, onChangeTrackBar, &src2Lab);
createTrackbar("A_min", winName, &A_minTrackBar, maxValue, onChangeTrackBar, &src2Lab);
createTrackbar("A_max", winName, &A_maxTrackBar, maxValue, onChangeTrackBar, &src2Lab);
createTrackbar("B_min", winName, &B_minTrackBar, maxValue, onChangeTrackBar, &src2Lab);
createTrackbar("B_max", winName, &B_maxTrackBar, maxValue, onChangeTrackBar, &src2Lab);
waitKey(0);
return 0;
}
// 回调函数
void onChangeTrackBar(int pos, void* usrdata)
{
强制类型转换
const Mat src = *(Mat*)(usrdata);
Mat dst;
vector<Mat> labChannels;
/*-------分离Lab的三个通道---------*/
split(src, labChannels);
//显示各个通道
Mat L_minChnnl, L_maxChnnl;
Mat A_minChnnl, A_maxChnnl;
Mat B_minChnnl, B_maxChnnl;
labChannels[0].copyTo(L_minChnnl); labChannels[0].copyTo(L_maxChnnl);
labChannels[1].copyTo(A_minChnnl); labChannels[1].copyTo(A_maxChnnl);
labChannels[2].copyTo(B_minChnnl); labChannels[2].copyTo(B_maxChnnl);
//imshow("Lab-L", labChannels[0]);
//imshow("Lab_a", labChannels[1]);
//imshow("Lab-b", labChannels[2]);
//waitKey(0);
// 二值化
threshold(labChannels[0], L_minChnnl, L_minTrackBar, 255, THRESH_BINARY);
threshold(labChannels[0], L_maxChnnl, L_maxTrackBar, 255, THRESH_BINARY_INV);
bitwise_and(L_minChnnl, L_maxChnnl, labChannels[0]); imshow("L", labChannels[0]);
threshold(labChannels[1], A_minChnnl, A_minTrackBar, 255, THRESH_BINARY);
threshold(labChannels[1], A_maxChnnl, A_maxTrackBar, 255, THRESH_BINARY_INV);
bitwise_and(A_minChnnl, A_maxChnnl, labChannels[1]); imshow("A", labChannels[1]);
threshold(labChannels[2], B_minChnnl, B_minTrackBar, 255, THRESH_BINARY);
threshold(labChannels[2], B_maxChnnl, B_maxTrackBar, 255, THRESH_BINARY_INV);
bitwise_and(B_minChnnl, B_maxChnnl, labChannels[2]); imshow("B", labChannels[2]);
Mat tmp,and3;
bitwise_and(labChannels[0], labChannels[1], tmp);
bitwise_and(labChannels[2], tmp, and3);
imshow(winName, and3);
merge(labChannels, dst);
imshow("dst", dst);
//Mat img2BGR;
//cvtColor(dst, img2BGR, CV_Lab2BGR);
//Mat img2Gray;
//cvtColor(img2BGR, img2Gray, CV_BGR2GRAY);
//imshow("img2Gray", img2Gray);
//waitKey(0);
}
// 回调函数
void callfirst(void* usrdata)
{
强制类型转换
const Mat src = *(Mat*)(usrdata);
Mat dst;
vector<Mat> labChannels;
/*-------分离Lab的三个通道---------*/
split(src, labChannels);
//显示各个通道
Mat L_minChnnl, L_maxChnnl;
Mat A_minChnnl, A_maxChnnl;
Mat B_minChnnl, B_maxChnnl;
labChannels[0].copyTo(L_minChnnl); labChannels[0].copyTo(L_maxChnnl);
labChannels[1].copyTo(A_minChnnl); labChannels[1].copyTo(A_maxChnnl);
labChannels[2].copyTo(B_minChnnl); labChannels[2].copyTo(B_maxChnnl);
//imshow("Lab-L", labChannels[0]);
//imshow("Lab_a", labChannels[1]);
//imshow("Lab-b", labChannels[2]);
//waitKey(0);
// 二值化
threshold(labChannels[0], L_minChnnl, L_minTrackBar, 255, THRESH_BINARY);
threshold(labChannels[0], L_maxChnnl, L_maxTrackBar, 255, THRESH_BINARY_INV);
bitwise_and(L_minChnnl, L_maxChnnl, labChannels[0]); imshow("L", labChannels[0]);
threshold(labChannels[1], A_minChnnl, A_minTrackBar, 255, THRESH_BINARY);
threshold(labChannels[1], A_maxChnnl, A_maxTrackBar, 255, THRESH_BINARY_INV);
bitwise_and(A_minChnnl, A_maxChnnl, labChannels[1]); imshow("A", labChannels[1]);
threshold(labChannels[2], B_minChnnl, B_minTrackBar, 255, THRESH_BINARY);
threshold(labChannels[2], B_maxChnnl, B_maxTrackBar, 255, THRESH_BINARY_INV);
bitwise_and(B_minChnnl, B_maxChnnl, labChannels[2]); imshow("B", labChannels[2]);
Mat tmp, and3;
bitwise_and(labChannels[0], labChannels[1], tmp);
bitwise_and(labChannels[2], tmp, and3);
imshow(winName, and3);
merge(labChannels, dst);
imshow("dst", dst);
//Mat img2BGR;
//cvtColor(dst, img2BGR, CV_Lab2BGR);
//Mat img2Gray;
//cvtColor(img2BGR, img2Gray, CV_BGR2GRAY);
//imshow("img2Gray", img2Gray);
//waitKey(0);
}