由于最开始接触的就是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; }
为了用C++版本重新实现,必须要找到各种函数现在的样子,为了省事,我直接把文档截图吧,英文也不是很难,不行查查词典也是可以看懂的。
从上图可以看出: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; }
太吓人!