OpenCV实践之路——TrackBar调整图像的亮度和对比度(OpenCV1和OpenCV2两种版本)

由于最开始接触的就是opencv2.0之后的版本,所以之前在看到Opencv1.0版本的C接口写就的代码时,感觉到诸多的不适应不习惯。今天做出了一个小小的突破,那就是见到opencv1.0的代码,我竟然想到用opencv2的C++版本重新实现一遍。顺便还简单了解了两个版本函数的变化和异同。本文前半部分主要参考下面的文章:HighGUI: Creating Interfaces。主要内容就是创建来两个trackbar,然后利用cvAddS(),cvScale()两个函数来实现对摄像头拍摄的视频的亮度和对比度的调整。

代码如下:

#include<opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	CvCapture* cap = 0;
	cap = cvCaptureFromCAM(0);
	if (!cap)
	{
		cout << "Can't open the camera!" << endl;
		return -1;
	}

	namedWindow("video");

	int bright = 128, contrast = 26;
	cvCreateTrackbar("bright", "video", &bright, 255, NULL);
	cvCreateTrackbar("contrast", "video", &contrast, 50, NULL);

	while (1)
	{
		IplImage* frame;
		frame = cvQueryFrame(cap);
		if (!frame)
		{
			cout << "can't open the image!" << endl;
			return -1;
		}

		cvAddS(frame, Scalar(bright - 128, bright - 128, bright - 128), frame);

		if (contrast>25)
			cvScale(frame, frame, contrast - 25);
		else if (contrast<25)
			cvScale(frame, frame, 1 / (double)(25 - contrast));
		cvShowImage("video", frame);

	
		if (char(waitKey(10)) == 27)
			break;
	}

	return 0;
}


这里头文件简单直接地包含opencv.hpp,两种版本全部包含,就不用切换了。

为了用C++版本重新实现,必须要找到各种函数现在的样子,为了省事,我直接把文档截图吧,英文也不是很难,不行查查词典也是可以看懂的。OpenCV实践之路——TrackBar调整图像的亮度和对比度(OpenCV1和OpenCV2两种版本)_第1张图片


从上图可以看出:cvAddS()可以用add()函数代替,而且里面的参数类型也有所变化,主要是指针与否。

下面看cvScale()函数的文档:



可以看到,从vScale()就是cvConvertScale()函数,然而。。。。。竟然木有看到C++接口。。还好下面有个公式。

其实我刚开始的时候并没有查到上面的结果。鬼使神差,我竟然查的时候查错了函数,于是我就查到了下面这货:



这是一个美丽的错误。我发现两者的公式简直是像,除了最后一项,然而我们这里正好有没有用到最后一项。cvScale()中最后一项默认为0,那我们也把scaleAdd()的最后一项设为0不就行了。于是现在代码就变成了下面这样:

#include<opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	//CvCapture* cap = 0;
	//cap = cvCaptureFromCAM(0);
	//if (!cap)
	//{
	//	cout << "Can't open the camera!" << endl;
	//	return -1;
	//}

	//namedWindow("video");

	//int bright = 128, contrast = 26;
	//cvCreateTrackbar("bright", "video", &bright, 255, NULL);
	//cvCreateTrackbar("contrast", "video", &contrast, 50, NULL);

	//while (1)
	//{
	//	IplImage* frame;
	//	frame = cvQueryFrame(cap);
	//	if (!frame)
	//	{
	//		cout << "can't open the image!" << endl;
	//		return -1;
	//	}

	//	cvAddS(frame, Scalar(bright - 128, bright - 128, bright - 128), frame);

	//	if (contrast>25)
	//		cvScale(frame, frame, contrast - 25);
	//	else if (contrast<25)
	//		cvScale(frame, frame, 1 / (double)(25 - contrast));
	//	cvShowImage("video", frame);

	//
	//	if (char(waitKey(10)) == 27)
	//		break;
	//}


	VideoCapture cap(0);
	if (!cap.isOpened())
	{
		cout << "Can't open the camera!" << endl;
		return -1;
	}

	namedWindow("video");

	int bright = 128, contrast = 26;
	createTrackbar("bright", "video", &bright, 255, NULL);
	createTrackbar("contrast", "video", &contrast, 50, NULL);

	while (1)
	{
		Mat frame;
		cap >> frame;
		if (!frame.data)
		{
			cout << "can't open the image!" << endl;
			return -1;
		}

		add(frame, Scalar(bright - 128, bright - 128, bright - 128), frame);
		Mat frame1(frame.rows, frame.cols, frame.type(), Scalar(0, 0, 0));
		
		if (contrast > 25)
			scaleAdd(frame, (double)(contrast - 25),frame1,frame);
		else if (contrast<25)
			scaleAdd(frame, 1 / (double)(25 - contrast), frame1, frame);
			
		imshow("video", frame);

	
		if (char(waitKey(10)) == 27)
			break;
	}

	return 0;
}


结果是一样的!!


OpenCV实践之路——TrackBar调整图像的亮度和对比度(OpenCV1和OpenCV2两种版本)_第2张图片


太吓人!








你可能感兴趣的:(C++,opencv,Visual,Studio)