OpenCV 2 마라톤 세 번 째 바퀴 - 대비 도와 밝기 변경

9476 단어 opencv
주머니 에 넣다.
  • 픽 셀 마다 접근
  • saturate 이해 하기cast 넘 침 방지 방법
  • 픽 셀 변환 을 초보 적 으로 알 고 있다
  • 초식 API
    그 전에 데이터 구조 와 방법 을 소개 하 겠 습 니 다.
    우선 코어 hpp 에 정 의 된
    typedef Vec<uchar, 2> Vec2b;
    typedef Vec<uchar, 3> Vec3b;
    typedef Vec<uchar, 4> Vec4b;
    
    typedef Vec<short, 2> Vec2s;
    typedef Vec<short, 3> Vec3s;
    typedef Vec<short, 4> Vec4s;
    
    typedef Vec<ushort, 2> Vec2w;
    typedef Vec<ushort, 3> Vec3w;
    typedef Vec<ushort, 4> Vec4w;    
        
    typedef Vec<int, 2> Vec2i;
    typedef Vec<int, 3> Vec3i;
    typedef Vec<int, 4> Vec4i;
    typedef Vec<int, 6> Vec6i;
    typedef Vec<int, 8> Vec8i;
    
    typedef Vec<float, 2> Vec2f;
    typedef Vec<float, 3> Vec3f;
    typedef Vec<float, 4> Vec4f;
    typedef Vec<float, 6> Vec6f;
    
    typedef Vec<double, 2> Vec2d;
    typedef Vec<double, 3> Vec3d;
    typedef Vec<double, 4> Vec4d;
    typedef Vec<double, 6> Vec6d;
    Vec 류 는 상관 하지 마 세 요. 이것 은 템 플 릿 류 입 니 다. 특히 이곳 의 Vec3b 에 관심 을 가 져 야 합 니 다. 왜 일 까요? 그 는 3 채널 RGB 를 넣 기 에 특히 적합 하기 때 문 입 니 다. 각각 uchar, 즉 0 - 255 입 니 다.
    다음은 Mat. hpp 파일 을 보 겠 습 니 다.
    아주 중요 한 방법 이 있 습 니 다.
    C++:  template T&  Mat:: at (int 
    i )  const
    C++:  template const T&  Mat:: at (int 
    i )  const
    C++:  template T&  Mat:: at (int 
    i, int 
    j )
    C++:  template const T&  Mat:: at (int 
    i, int 
    j )  const
    C++:  template T&  Mat:: at (Point 
    pt )
    C++:  template const T&  Mat:: at (Point 
    pt )  const
    C++:  template T&  Mat:: at (int 
    i, int 
    j, int 
    k )
    C++:  template const T&  Mat:: at (int 
    i, int 
    j, int 
    k )  const
    C++:  template T&  Mat:: at (const int* 
    idx )
    C++:  template const T&  Mat:: at (const int* 
    idx )  const
    Parameters:
    i – Index along the dimension 0
    j – Index along the dimension 1
    k – Index along the dimension 2
    pt – Element position specified as Point(j,i) .
    idx – Array of Mat::dims indices.
    가장 중요 한 것 은 row 와 column 에 따라 접근 하 는 것 입 니 다.
    template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
    {
        CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
            (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) &&
            CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
        return ((_Tp*)(data + step.p[0]*i0))[i1];
    }
    image. at < Vec3b > (y, x) [0] 은 y 행 x 열의 red 값 을 방문 할 수 있 습 니 다. 
    image. at < Vec3b > (y, x) [1] y 줄 x 열의 green 값 에 접근 할 수 있 습 니 다. 
    image. at < Vec3b > (y, x) [2] y 줄 x 열의 blue 값 에 접근 할 수 있 습 니 다. 
    또한 Matt 는 MATLAB 와 Octave 와 같은 초기 화 방법 도 있 습 니 다.
    Use MATLAB-style array initializers, zeros(), ones(), eye(), for example:
    // create a double-precision identity martix and add it to M.
    M += Mat::eye(M.rows, M.cols, CV_64F);


    다음은 zeros 를 사용 하려 면 zeros 의 인 터 페 이 스 를 소개 합 니 다.
    C++:  
    static MatExpr  Mat:: zeros (int 
    rows, int 
    cols, int 
    type )
    C++:  
    static MatExpr  Mat:: zeros (Size 
    size, int 
    type )
    C++:  
    static MatExpr  Mat:: zeros (int 
    ndims, const int* 
    sz, int 
    type ) ¶
    Parameters:
    ndims – Array dimensionality.
    rows – Number of rows.
    cols – Number of columns.
    size – Alternative to the matrix size specification Size(cols, rows) .
    sz – Array of integers specifying the array shape.
    type – Created matrix type.
    The method returns a Matlab-style zero array initializer. It can be used to quickly form a constant array as a function parameter, part of a matrix expression, or as a matrix initializer.
    Mat A;
    A = Mat::zeros(3, 3, CV_32F);

    예 를 들 어 나 는 두 번 째 방법 으로 이렇게 쓸 수 있다.
    Mat image = imread( argv[1] );
    Mat new_image = Mat::zeros( image.size(), image.type() );

    또 하나의 유용 한 템 플 릿 함 수 는 saturate 입 니 다.cast, 넘 치 는 것 을 효과적으로 방지 할 수 있 습 니 다.
    uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN)
    short b = saturate_cast<short>(33333.33333); // b = 32767 (SHORT_MAX)
    
    
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    
    using namespace cv;
    
    double alpha; /**< Simple contrast control */
    int beta;  /**< Simple brightness control */
    
    int main( int, char** argv )
    {
       /// Read image given by user
       Mat image = imread( argv[1] );
       Mat new_image = Mat::zeros( image.size(), image.type() );
    
       std::cout<<" Basic Linear Transforms "<<std::endl;
       std::cout<<"-------------------------"<<std::endl;
       std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
       std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
    
    
       /// Do the operation new_image(i,j) = alpha*image(i,j) + beta
       /// Instead of these 'for' loops we could have used simply:
       /// image.convertTo(new_image, -1, alpha, beta);
       /// but we wanted to show you how to access the pixels :)
       for( int y = 0; y < image.rows; y++ )
          { for( int x = 0; x < image.cols; x++ )
               { for( int c = 0; c < 3; c++ )
                    {
              new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
                    }
           }
          }
    
       namedWindow("Original Image", 1);
       namedWindow("New Image", 1);
    
       imshow("Original Image", image);
       imshow("New Image", new_image);
    
       waitKey();
       return 0;
    }
    위 에 지식 이 있 으 니 금방 알 아 볼 수 있 을 것 같 아 ~ ~
    주석 에서 말 한 것 처럼 우 리 는 함수 가 직접 목적 을 달성 할 수 있 으 므 로 우리 가 옮 겨 다 닐 필요 가 없다.
    C++: void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 ) const
    여기 const 는 이 함수 조작 이 변수 나 대상 같은 값 에 영향 을 주지 않 는 다 는 것 이다.
    rtype 은 - 1 로 input 와 output 의 유형 이 일치 하여 매우 편리 하 다 는 것 을 나타 낸다.
    변환 공식:
    다음은 컨트롤 바 의 대비 도 변환 입 니 다.
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    
    using namespace cv;
    
    int alpha = 50;
    Mat image,new_image;
    static void change_color(int, void*)
    {
    	for( int y = 0; y < image.rows; y++ )
    		for( int x = 0; x < image.cols; x++ )
    			for( int c = 0; c < 3; c++ )
              			new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha/50.0 *( image.at<Vec3b>(y,x)[c] ));
    
        	imshow("Image", new_image);
    }
    
    int main( int, char** argv )
    {
       	image = imread( argv[1] );
       	new_image = Mat::zeros( image.size(), image.type() );
       	namedWindow("Image", 1);
    
    	createTrackbar( "pick:", "Image", &alpha, 100, change_color);
    	change_color(0, 0);
    
    	waitKey();
    	return 0;
    }
    컨트롤 바 에 대해 서 는 잠시 상관 하지 않 아 도 됩 니 다. (사실은 아주 간단 합 니 다) 쉽게 알 아 볼 수 있 을 거 라 고 믿 습 니 다.
    하 나 를 들 면 열 을 안다
    공식:
    Computer Vision: Algorithms and Applications 소개
    알파 는 contrast 를 제어 하 는 것 이 라 고 볼 수 있 습 니 다. 베타 는 brightness 를 제어 합 니 다. 알파 와 베타 도 고정 적 인 것 이 아니 라 공간의 함수 라 고 할 수 있 습 니 다. 저 는 image processing 에서 도 말 했 습 니 다.
    컴퓨터 시각 토론 군 162501053
    전재 설명:http://blog.csdn.net/abcd1992719g

    좋은 웹페이지 즐겨찾기