Pic2Face

2021. 3. 17. 16:36PS/Problem Solving

(학교 정보과학프로젝트 시간에 만들었다고 아무도 말하지 않았습니다.)

||
||
||
V

사진을 입력하면 사진에 웃는 형태의 틀을 덮어 씌워 준다.

본격 Pic2Face 메소드
이 버전은 검은색이 주류인 사진은 사용할 수 없다.

//Full Code : http://colorscripter.com/s/STJKOfy
inline void Gradient(unsigned char B[HEIGHT][WIDTH],unsigned char G[HEIGHT][WIDTH],unsigned char R[HEIGHT][WIDTH],int weight=400) {
    double fordivideheight = 1.0*HEIGHT / weight;
    double fordividewidth = 1.0*WIDTH / weight;
    int MAX = 0;
    for(int i=0;i<HEIGHT;i++)
        for(int j=0;j<WIDTH;j++){
            int chg1 = std::abs(i / fordivideheight-weight*0.73) + std::abs(j / fordividewidth - weight*0.75);
            int chg2 = std::abs(i / fordivideheight-weight*0.73) + std::abs(j / fordividewidth - weight*0.25);
            int chg3 = std::abs(i / fordivideheight-weight*0.5) + std::abs(j / fordividewidth - weight*0.5);
            chg3 *= 2;
            double xcoor = std::abs(j / fordividewidth - weight*0.5);
            double ycoor = std::abs(i / fordivideheight-weight*0.01);
            double expycoor = xcoor*xcoor*0.0111;
            int chg4 = 100;
            if(std::abs(ycoor-expycoor)<10) chg4 = 0;
            int change = std::min({chg1,chg2,chg3,chg4});
            for(auto pt:{&B[i][j],&G[i][j],&R[i][j]}){
                auto&x = *pt;
                x = std::min(std::max(x-change*4,0),255);
            }
        }
}

Hard-Coding으로 개발했기에 가독성과 범용성이 뛰어나다고
절대 말할 수 없다.

원리는 눈을 만들고 싶은 좌표를 입력 받아서 그곳을 기준으로 해밀턴거리가 특정 값 이하인 곳만 원 색을 보존한다. (거리가 멀어질 수록 밝기를 낮게)

이제 입꼬리 모양은 $y = 0.0111 x^2$를 기준으로 특정 폭 이하인 좌표들만 밝기를 유지한다.

본격 개발자가 휴리스틱 돌리는 개발 ㅋㅋ

728x90

'PS > Problem Solving' 카테고리의 다른 글

뫼비우스 역공식  (1) 2021.03.25
Cgiosy의 수학 코드  (0) 2021.03.22
독자들에게 가끔씩 바라는 점  (24) 2021.03.09
메타인지 #1  (0) 2021.03.07
CF #705 Div.2  (0) 2021.03.07