好久没有写博客了,最近在看OpenCV,于是动手写了个简单的RGB调色器,在终端实时输出RGB的值。通过这个程序学习滑动条的使用。程序中主要用到cvCreateTrackbar ,其用法如下:
cvCreateTrackbar
创建trackbar并将它添加到指定的窗口。
CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) );
int cvCreateTrackbar( const char* trackbar_name, const char* window_name,
int* value, int count, CvTrackbarCallback on_change );
trackbar_name
被创建的trackbar名字。
window_name
窗口名字,这个窗口将为被创建trackbar的父对象。
value
整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。
count
滑块位置的最大值。最小值一直是0。
on_change
每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。
函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,并且指定当trackbar位置被改变的时候调用的回调函数。被创建的trackbar显示在指定窗口的顶端。
#include "cv.h" #include "highgui.h" #include "iostream" using namespace std; IplImage *image; int R=0,G=0,B=0; void callback_R(int position) { cout<<"("<<B<<","<<G<<","<<R<<")"<<endl; R=position; cvSet(image,cvScalar(B,G,R)); cvShowImage("image",image); } void callback_G(int position) { cout<<"("<<B<<","<<G<<","<<R<<")"<<endl; G=position; cvSet(image,cvScalar(B,G,R)); cvShowImage("image",image); } void callback_B(int position) { cout<<"("<<B<<","<<G<<","<<R<<")"<<endl; B=position; cvSet(image,cvScalar(B,G,R)); cvShowImage("image",image); } int main() { //IplImage *image; image=cvCreateImage(cvSize(300,300),IPL_DEPTH_8U,3); cvZero(image); cvNamedWindow("image"); cvShowImage("image",image); cvCreateTrackbar("R","image",NULL,225,callback_R); cvCreateTrackbar("G","image",NULL,225,callback_G); cvCreateTrackbar("B","image",NULL,225,callback_B); while(1) { if(cvWaitKey(0)==27) break; } return 0; }效果: