OpenCVスライダーTrackbar C/C+/Python


OpenCVスライダーTrackbar C/C+/Python
参考:
opencvスライダーcvCreateTrackbar():http://blog.csdn.net/u012005313/article/details/46788445 createTrackbar:http://docs.opencv.org/2.4.11/modules/highgui/doc/user_interface.菗createtrackbar Adding a Trackbar to our aplications!:http://docs.opencv.org/2.4.11/doc/tutorials/highgui/trackbar/trackbar.html#adding-a-trocbar-to-our-appration s
スライダー制御パラメータの変更を使って、コールバック関数を呼び出して表示された画像を修正します。
主な内容
  • C/C++/Python関数形式
  • C++でスライダー
  • を起動する。
  • Cでスライダー
  • を起動する。
  • Pythonでスライダー
  • を起動する。
  • getTrackbarPos
  • C/C++/Python関数形式C++関数:
    int createTrackbar(const string& trackbarname, const string& winname,
         int* value, int count, TrackbarCallback onChange=0, void* userdata=0)
    
    パラメータ:
  • trackbarname:スライダー名、スライダーの識別子、異なるスライダーは異なるスライダー名
  • を有する。
  • winname:ウィンドウ名、スライダーがバインディングしたいウィンドウの名前
  • value:オプションで、スライダの位置を反映します。スライダーを作成するときは、この値でスライダ位置を指定します。
  • count:スライダ最大値です。最小値は通常0
  • である。
  • onChange:コールバック関数、関数のプロトタイプはvoid Foo(int,void*)です。
  • where the first parameter is the trocbar position and the second parameter is the user data.
  • If the calback is the NULL pointer、no calbacks are caled、but only value is udated`
  • userdata:User data that is passed as is to the callback.
    • It can be used to handle trackbar events without using global variables.
  • C関数:
    int cvCreateTrackbar(const char* trackbar_name, const char* window_name,
         int* value, int count, CvTrackbarCallback on_change=NULL )
    
    パラメータ:
  • trocbar_name:同
  • window_name:同
  • value:同
  • count:同
  • on_change:関数の原型はvoid Foo(int)
  • です。Python関数:
    def createTrackbar(trackbarName, windowName, value, count, onChange)
    
    パラメータ:同じです。onChangeコールバック関数にはパラメータがあります。C++でスライダーを呼び出します。
    プログラム1:形態膨張動作を行い、反復回数を変更する。
    #include 
    #include 
    #include 
    using namespace std;
    using namespace cv;
    
    //     
    const string trackbarname = "expand";
    //    
    const string winname = "TrackbarDemo";
    //    
    const int maxNum = 10;
    
    //    
    int value = 3;
    
    Mat img;
    Mat res;
    
    int dilation_type = MORPH_RECT;
    int dilation_size = 1;
    Mat element = getStructuringElement(dilation_type, 
        Size(2 * dilation_size + 1, 2 * dilation_size + 1),
        Point(dilation_size, dilation_size));
    
    void onExpand(int, void*) {
        printf("value: %d
    ", value); dilate(img, res, element, Point(-1, -1),value); imshow(winname, res); } int main(int argc, char* argv[]) { img = imread("c:\\lena.jpg", -1); if (img.empty()) { exit(0); } res = img.clone(); namedWindow(winname); createTrackbar(trackbarname, winname, &value, maxNum, onExpand, NULL); onExpand(0, NULL); waitKey(0); return 0; }
    結果:
    OpenCV 滑动条Trackbar C/C++/Python_第1张图片
    複数のパラメータを変更する必要がある場合は、複数のスライダーを使用することができます。
    プログラム2:反復回数及び核サイズの変更
    #include 
    #include 
    #include 
    using namespace std;
    using namespace cv;
    
    //     
    const string trackbarname1 = "interation";
    const string trackbarname2 = "dilationSize";
    //    
    const string winname = "TrackbarDemo";
    //    
    const int maxNum1 = 10;
    const int maxNum2 = 5;
    
    //    
    int interationValue = 3;
    int dilationSize = 2;
    
    Mat img;
    Mat res;
    
    int dilation_type = MORPH_RECT;
    
    void onDilate(int, void*) {
        printf("dilationSize: %d
    ", dilationSize); printf("interationValue: %d
    ", interationValue); Mat element = getStructuringElement(dilation_type, Size(2 * dilationSize + 1, 2 * dilationSize + 1), Point(dilationSize, dilationSize)); dilate(img, res, element, Point(-1, -1), interationValue); imshow(winname, res); } int main(int argc, char* argv[]) { img = imread("c:\\lena.jpg", -1); if (img.empty()) { exit(0); } res = img.clone(); namedWindow(winname); createTrackbar(trackbarname1, winname, &interationValue, maxNum1, onDilate, NULL); createTrackbar(trackbarname2, winname, &dilationSize, maxNum2, onDilate, NULL); onDilate(0, NULL); waitKey(0); return 0; }
    結果:
    OpenCV 滑动条Trackbar C/C++/Python_第2张图片Cでスライダーを呼び出します。
    プログラム1:形態膨張動作を行い、反復回数を変更する。
    #include 
    #include 
    #include 
    #include 
    
    //     
    const char* trackbarname = "interation";
    //    
    const char* winanme = "TrackbarDemo";
    //    
    const int maxNum = 10;
    
    int interationValue = 3;
    
    IplImage* img;
    IplImage* res;
    
    IplConvKernel* element;
    
    void onDilate(int arg) {
    
        printf("interationValue: %d
    ", interationValue); cvDilate(img, res, element, interationValue); cvShowImage(winanme, res); } int main(int argc, char* argv[]) { img = cvLoadImage("c:\\lena.jpg", CV_LOAD_IMAGE_UNCHANGED); if (img->imageData == NULL) { exit(0); } res = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels); int dilationSize = 1; int row = dilationSize * 2 + 1; int col = dilationSize * 2 + 1; element = cvCreateStructuringElementEx(2 * dilationSize + 1, 2 * dilationSize + 1, dilationSize, dilationSize, CV_SHAPE_RECT, NULL); cvNamedWindow(winanme, CV_WINDOW_AUTOSIZE); cvCreateTrackbar(trackbarname, winanme, &interationValue, maxNum, onDilate); onDilate(0); cvWaitKey(0); cvReleaseStructuringElement(&element); cvReleaseImage(&img); cvReleaseImage(&res); cvDestroyWindow(winanme); return 0; }
    プログラム2:反復回数及び核サイズの変更
    #include 
    #include 
    #include 
    #include 
    
    //     
    const char* trackbarname1 = "interation";
    const char* trackbarname2 = "dilationSize";
    //    
    const char* winanme = "TrackbarDemo";
    //    
    const int maxNum1 = 10;
    const int maxNum2 = 5;
    
    int interationValue = 3;
    int dilationSize = 1;
    
    IplImage* img;
    IplImage* res;
    
    IplConvKernel* element;
    
    void onDilate(int arg) {
    
        printf("interationValue: %d
    ", interationValue); printf("dilationSize: %d
    ", dilationSize); int row = dilationSize * 2 + 1; int col = dilationSize * 2 + 1; element = cvCreateStructuringElementEx(2 * dilationSize + 1, 2 * dilationSize + 1, dilationSize, dilationSize, CV_SHAPE_RECT, NULL); cvDilate(img, res, element, interationValue); cvShowImage(winanme, res); cvReleaseStructuringElement(&element); } int main(int argc, char* argv[]) { img = cvLoadImage("c:\\lena.jpg", CV_LOAD_IMAGE_UNCHANGED); if (img->imageData == NULL) { exit(0); } res = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels); cvNamedWindow(winanme, CV_WINDOW_AUTOSIZE); cvCreateTrackbar(trackbarname1, winanme, &interationValue, maxNum1, onDilate); cvCreateTrackbar(trackbarname2, winanme, &dilationSize, maxNum2, onDilate); onDilate(0); cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&res); cvDestroyWindow(winanme); return 0; }
    Pythonでスライダーを呼び出します。
    プログラム1:形態膨張動作を行い、反復回数を変更する。
    # -*- coding: utf-8 -*-
    
    import cv2
    import os
    
    trackbar_name = "interation"
    win_name = "TrackbarDemo"
    
    max_num = 10
    value = 3
    
    kernerl = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    
    
    def on_dialte(arg):
        """
            
        :param arg:
        :return:
        """
        value = cv2.getTrackbarPos(trackbar_name, win_name)
        print "value:", value
    
        res = cv2.dilate(img, kernerl, None, None, value)
        cv2.imshow(win_name, res)
    
    
    if __name__ == '__main__':
        img = cv2.imread("c:\\lena.jpg", cv2.CV_LOAD_IMAGE_UNCHANGED)
        if img is None:
            os._exit(0)
    
        cv2.namedWindow(win_name)
        cv2.createTrackbar(trackbar_name, win_name, value, max_num, on_dialte)
    
        on_dialte(0)
    
        cv2.waitKey(0)
    
    プログラム2:反復回数及び核サイズの変更
    # -*- coding: utf-8 -*-
    
    import cv2
    import os
    
    trackbar_name1 = "interation"
    trackbar_name2 = "dilationSize"
    
    win_name = "TrackbarDemo"
    
    max_num1 = 10
    max_num2 = 5
    
    interation_value = 3
    dilation_size = 1
    
    
    def on_dilate(arg):
        """
               
        :param arg:
        :return:
        """
        value = cv2.getTrackbarPos(trackbar_name1, win_name)
        print "value:", value
        size = cv2.getTrackbarPos(trackbar_name2, win_name)
        print "size:", size
    
        kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2 * size + 1, 2 * size + 1))
        res = cv2.dilate(img, kernel, None, None, value)
        cv2.imshow(win_name, res)
    
    
    if __name__ == '__main__':
        img = cv2.imread("c:\\lena.jpg", cv2.CV_LOAD_IMAGE_UNCHANGED)
        if img is None:
            os._exit(0)
    
        cv2.namedWindow(win_name)
        cv2.createTrackbar(trackbar_name1, win_name, interation_value, max_num1, on_dilate)
        cv2.createTrackbar(trackbar_name2, win_name, dilation_size, max_num2, on_dilate)
    
        on_dilate(0)
    
        cv2.waitKey(0)
    
    get TrackbarPos
    参考:get TrackbarPosC++関数:
    int getTrackbarPos(const string& trackbarname, const string& winname)
    
    C関数:
    int cvGetTrackbarPos(const char* trackbar_name, const char* window_name)
    
    Python関数:
    cv2.getTrackbarPos(trackbarname, winname) → retval
    
    パラメータ:
    一つ目:スライダー名二つ目:ウィンドウ名
    戻り値:スライドバーの現在位置を指定します。