[opencv][C++][车牌识别]VS2019在opencv2下模仿openmvIDE的阈值编辑器

12 篇文章 0 订阅
5 篇文章 0 订阅

上原图(街边拍摄,仅供学习使用):
在这里插入图片描述
上目标图:

在这里插入图片描述

想用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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值