레이블이 원 검출인 게시물을 표시합니다. 모든 게시물 표시
레이블이 원 검출인 게시물을 표시합니다. 모든 게시물 표시

2017년 3월 3일 금요일

1932 숫자삼각형

백준 1932 숫자삼각형 https://www.acmicpc.net/problem/1932

다음과 같은 규칙을 만족해야 한다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

여기서 샘플을 이용하여 문제를 따라가면 중첩되는 부분을 알 수 있다.
층에서 내려올때의 경우의 수를 먼저 구해보자
경우의 수는 7,3,8/ 7,3,1/ 7,8,1/ 7,8,0 이 나오는데 문제에서는 최대 경로를 구하는 것이므로 이중에서 가운데 있는 부분(3층의 숫자1)은 2가지경우중 더 큰곳에 대해서만 Memoization해 놓으면 된다.

따라서 층입력이 500까지 되므로 cache를 500 * 500 공간으로 잡아서 DP를 시행하면 된다.
DP를 정의하자면
DP[N][M]  : N층 M번째 숫자 까지의 최대 경로

DP[N][1] = DP[N-1][1] + Floor[N][1]
DP[N][N] = DP[N-1][N-1] + Floor[N][N]

for(i = 2; i < N; i++)
     DP[N][i] = max(D[N - 1][i - 1], D[N - 1][i]) + Floor[N][i];


#include <cstdio>
#define max(a,b) ((a>b)?a:b)
int arr[501][501];
int D[501][501];
int main(){
    int N, ans = 0;
    scanf("%d"&N);
 
    for (int n = 1; n <= N; n++){
        for (int m = 1; m <= n; m++){
            scanf("%d"&arr[n][m]);
        }
        if (n == 1)
            D[1][1= arr[1][1];
        else{
            D[n][1= D[n - 1][1+ arr[n][1];
            D[n][n] = D[n - 1][n - 1+ arr[n][n];
            ans = max(D[n][1], D[n][n]);
            for (int k = 2; k < n; k++){
                D[n][k] = max(D[n - 1][k - 1], D[n - 1][k]) + arr[n][k];
                if (n == N)
                    ans = max(ans, D[N][k]);
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}
cs

2015년 7월 16일 목요일

제4장) RGB값을 HSV로 변환하여 빛에따른 오차 줄이기

원검출에는 성공하긴하였지만 바둑알이 빛에 비치면서 흑돌임에도 불구하고 조명위치에따라 흰색이 검출되어 검출이 안될 경우가있다.
1
2
3
4
5
6
7
value = cvGet2D(frame, cvRound(circle[1]), cvRound(circle[0]));        //(원본,y,x)
if (value.val[0< 100 && value.val[1< 100 && value.val[2< 100 && rx4 > 0){
.....
.....
}
cs
실제로 2장 원검출 - 에서 원의중심 point의 RGB값을 100미만으로 설정됬을때만
검출하도록 실시하였는데 그점부분이 빛에따라 검출이 되지 않았다. 

따라서 원하는 색(흑색) RGB값을 HSV로 변환하여 masking 및 모폴로지 후에
흑돌을 추출하도록 하기로하였다.

2015년 7월 6일 월요일

제3장)바둑판에서 바둑돌 저장하기

 영상에서 바둑판도 입력받고 바둑알도 입력받을 수 있으니 이제 그 바둑돌의 좌표를 실제 2차원배열에 저장하면 영상처리의 일은 거의 끝났다고 봐도 과분하다.


















제2장)Open CV를 이용한 원검출 - ②

저번 포스트에 이어 이번포스트는 흑돌만 검출하는 과정 + 이번에 했던 삽질에 대해 포스팅하겠다..
흑돌만 검출하는 과정은 픽셀에 직접접근하여 RGB값에대해 범위를 설정하여 추출하였다.
1
2
3
4
5
6
CvScalar value;    //픽셀값 직접접근
value = cvGet2D(frame, cvRound(circle[1]), cvRound(circle[0]));        //(원본,y,x)
if (value.val[0< 100 && value.val[1< 100 && value.val[2< 100 && rx4 > 0){
.....
.....
}
cs
다음과 같이 value라는 변수를 선언하여 각각의 RGB값을
(여기서는 val[0],val[1],val[2]순으로 BGR이다)
 100미만으로 범위를 설정하여 흑돌을 추출하였다. 
RGB검출 참고 페이지 http://ha927.com.ne.kr/RGB.html

다음포스트에서는 영상에서 입력받는 바둑돌의 좌표를 저장해 보겠다.

제2장)Open CV를 이용한 원검출 - ①

원검출은 저번 포스팅에서의 사각형검출과는 다르게 이미 구현된 함수를 사용하였다.
바로 허프변환으로 나타난 cvHoughCircles라는 함수이다!
> 허프변환이란?
영상에 있는 점들이 이루는 모든직선들 중에서 가장 많이 겹치는 부분을 추출하는 변환이다.