2017년 8월 12일 토요일

opencv 영상의 평균밝기를 지나는 직선의 방정식의 기울기를 trackbar 로 조절


1.전역변수 선언 필요
 - 반환할 주소 값 나타내는 변수 여기선 alpha
 - main, 외부함수에서 사용할 Mat 형 변수.
 - 전역변수 선언 안하고 void* userdata=0; 구문 바꾸어서 데이터 전달하려고 시도했으나
   실패..

2.createTrackbar("트랙바이름", "표시될위치",int 값 반환할 주소, 트랙바에서 최대값, 슬라이더 위치 바뀌면 실행 될 콜백 함수,?)

    namedWindow("controled");
    createTrackbar("brigtnesscontrol", "controled", &alpha, 256*8/* alpha max 8로 설정*/, on_trackbar, NULL); 


3.콜백함수
콜백함수 모르겠음..
void on_trackbar(int, void*);


4.code

adjcont

#pragma warning(disable: 4819)

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

void on_trackbar(int, void*);
Mat dst,src;
int alpha=4*256;//alpha 값 최대 256*8
double input_image_luminous_sum = 0;
double output_image_luminous_sum = 0;
int pixel_count;
int input_img_lumi_mean = 0;

int main(int argc, char** argv)
{
    src = imread("lenna.bmp", IMREAD_GRAYSCALE);    if (src.empty()) { cerr << "Image load failed!" << endl; return -1; }
    dst.create(src.rows, src.cols, src.type());
    pixel_count = (src.rows)*(src.cols);
    // 평균 휘도 구하기
    for (int i = 0; i < src.rows; i++) {
        for (int j = 0; j < src.cols; j++) {
            input_image_luminous_sum = src.at<uchar>(i, j) + input_image_luminous_sum;
        }
    }
    input_img_lumi_mean = input_image_luminous_sum / pixel_count; // 평균 휘도
    namedWindow("controled");
    createTrackbar("brigtnesscontrol", "controled", &alpha, 256*8/* alpha max 8로 설정*/, on_trackbar, NULL);
    
    cout << "input image 평균휘도 (input_image_luminous_mean/pixel_count) : " << input_image_luminous_sum / pixel_count << "\n" << endl;
    cout << "초기 alpha : " << alpha/256. << "\n" << endl;
    imshow("src", src);
    dst = src + (src - input_img_lumi_mean)*(alpha / 256.);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

void on_trackbar(int, void*) {
    output_image_luminous_sum = 0;
    dst = src + (src - input_img_lumi_mean)*(alpha / 256.);
    for (int i = 0; i < src.rows; i++) {
        for (int j = 0; j < src.cols; j++) {
            output_image_luminous_sum = dst.at<uchar>(i, j) + output_image_luminous_sum;
        }
    }
    cout << "output image 평균휘도 (output_image_luminous_mean/pixel_count) : " << (output_image_luminous_sum / pixel_count) << "\n" << endl;
    cout << "alpha : " << alpha/256. << "\n" << endl;
    imshow("src", src);
    imshow("dst", dst);
}

댓글 없음:

댓글 쓰기