#! game snake


import pygame, sys, time, random
from pygame.locals import *

pygame.init()
fpsClock = pygame.time.Clock()

playSurface = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Raspberry Snake')
redColor = pygame.Color(255,0,0)
blackColor = pygame.Color(0,0,0)
whiteColor = pygame.Color(255,255,255,0)
greyColor = pygame.Color(150,150,150)

snakePosition = [100,100]
snakeSegments = [[100,100],[80,100],[60,100]]
raspberryPosition = [300,300]
raspberrySpawned = 1
direction = 'right'
changeDirection = direction

def gameOver():
    gameOverFont = pygmae.font.Font('freesansbold.ttf',72)
    gameOverSurf = gameOverFont.render('Game Over',True,greyColor)
    gameOverRect = gameOverSurf.get_rect()
    playSurface.blit(gameOverSurf, gameOverRect)
    pygame.display.flip()
    time.sleep(5)
    pygame.quit()
    sys.exit()
   
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_RIGHT or event.key == ord('d'):
                changeDirection = 'right'
            if event.key == K_LEFT or event.key == ord('a'):
                changeDirection = 'left'
            if event.key == K_UP or event.key == ord('w'):
                changeDirection = 'up'
            if event.key == K_DOWN or event.key == ord('s'):
                changeDirection = 'down'
            if event.key == K_ESCAPE:
                pygame.event.post(pygame.event.Event(QUIT))
       
    if changeDirection == 'right' and not direction == 'left':
        direction = changeDirection
    if changeDirection == 'left' and not direction == 'right':
        direction = changeDirection
    if changeDirection == 'up' and not direction == 'down':
        direction = changeDirection
    if changeDirection == 'down' and not direction == 'up':
        direction = changeDirection
       
    if direction == 'right':
        snakePosition[0] += 20
    if direction == 'left':
        snakePosition[0] -= 20
    if direction == 'up':
        snakePosition[1] -= 20
    if direction == 'down':
        snakePosition[1] += 20

    snakeSegments.insert(0,list(snakePosition))
        
    if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:
        raspberrySpawned = 0
    else:
        snakeSegments.pop()
       
    if raspberrySpawned == 0:
        x = random.randrange(1,32)
        y = random.randrange(1,24)
        raspberryPosition = [int(x*20),int(y*20)]
    raspberrySpawned = 1

    playSurface.fill(blackColor)
    for position in snakeSegments:
        pygame.draw.rect(playSurface,whiteColor,Rect(position[0], position[1], 20, 20))
        pygame.draw.rect(playSurface,redColor,Rect(raspberryPosition[0], raspberryPosition[1], 20, 20))
    pygame.display.flip()

    if snakePosition[0] > 620 or snakePosition[0] < 0:
        gameOver()
    if snakePosition[1] > 460 or snakePosition[1] < 0:
        gameOver()

    for snakeBody in snakeSegments[1:]:
        if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:
            gameOver()

    fpsClock.tick(20)

'공 부  > Raspberry pi b+' 카테고리의 다른 글

리눅스 시리얼통신 예제가 있는 사이트  (0) 2015.03.18
snake game in python  (0) 2015.03.12
by 아발로온v 2015.03.12 11:18

이미지의 픽셀에 대하여 공부를 하였으니


이번에는 간단하게 이미지를 가지고 조작을 해보겠습니다.


먼저 이미지 하나하나가 픽셀로 이루어져 있고, 지난번 gray_image로 만드는 방법과 복사하는 방법을 보면


각각의 픽셀을 opencv를 통해 원하는대로 조종할 수 있다고 배웠습니다.


어떤 이미지가 있다면, 이 이미지 속의 랜덤한 픽셀들의 화소값을 바꾸면서 실험을 해 보겠습니다.


먼저 픽셀의 값은 흑백의 경우 0~255(0:black, 255:white) 라고 하였고, color image의 경우에는 각각의 RGB값이 0~255(8bit)를 나타내서 합쳐진다고 하였습니다.


첫번째는 먼저 랜덤한 픽셀들의 화소값을 255(white)로 바꾸도록 하겠습니다.


color 이미지의 경우에는 당연히 channels인 R, G, B가 모두 255여야지 white가 된답니다.



#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void whitespace(cv::Mat &image, int num);

void main()
{        
     cv::Mat image = cv::imread("6.jpg");
     whitespace(image, 5000);
     cv::namedWindow("output");
     cv::imshow("output", image);
     cv::waitKey(0);
}


void whitespace(cv::Mat &image, int num)
{
     for (int k = 0; k < num; k++)
     {
           int i = rand() % image.cols;
           int j = rand() % image.rows;

           if (image.channels() == 1){
               image.at<uchar>(j, i) = 255;
          }
          else if (image.channels() == 3){
               image.at<cv::Vec3b>(j, i)[0] = 255;
               image.at<cv::Vec3b>(j, i)[1] = 255;              

               image.at<cv::Vec3b>(j, i)[2] = 255;         

          }
     }
}

 



위의 소스는 불러온 이미지가 흑백사진인지(channels ==1 ) 아니면 컬러사진인지(channels == 3) 를 확인 한 후에


각각의 이미지의 행과 열에서 랜덤으로 받은 값 i,j를 통해 픽셀의 위치를 찾고, 벡터값을 이용하여 255라는 픽셀값을 넣어주었습니다.


이미지에서 보는 것과 같이 랜덤한 곳에 whitespace가 나타난 것을 알 수 있습니다.


이번에는 반대로 0의 값을 줘보겠습니다.


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void blackspace(cv::Mat &image, int num);

      

void main()
{
      cv::Mat image = cv::imread("6.jpg");
      blackspace(image, 5000);
      cv::namedWindow("output");
      cv::imshow("output", image);
      cv::waitKey(0);
}


void blackspace(cv::Mat &image, int num)
{
      for (int k = 0; k < num; k++)
      {
            int i = rand() % image.cols;
            int j = rand() % image.rows;      

            if (image.channels() == 1){
                  image.at<uchar>(j, i) = 0;
            }
            else if (image.channels() == 3){
                  image.at<cv::Vec3b>(j, i)[0] = 0;
                  image.at<cv::Vec3b>(j, i)[1] = 0;
                  image.at<cv::Vec3b>(j, i)[2] = 0;
            }
      }
}

 



다음과 같이 픽셀 조작을 해보았습니다.


by 아발로온v 2014.04.09 18:54

저번에는 단순히 이미지를 복사해서 붙여 넣거나 flip을 통해서 상하 좌우 를 바꾸는 것에 대하여 보았습니다.


이제는 진정한 opencv로 입문하게 되는 pixel 조작에 대해서 글을 써보겠습니다.


pixel은 컴퓨터 디스플레이 또는 컴퓨터 이미지를 구성하고 있는 최소 단위의 점입니다. 우리나라에서는 화소로 쓰이기도 합니다.


컴퓨터 사양중에 해상도를 보면 1600X900 같은 것을 볼 수 있는데요. 이 숫자들이 가로 세로 표현할 수 있는 최대 픽셀수를 나타내는 것 입니다.


자 그러면 이미지의 픽셀을 이용해 조작해 보도록 하겠습니다.






보통 우리가 RGB값이라고 많이 이야기를 하는 RGB는 red green blue 3원색을 나타내는 표현입니다.


이 삼원색을 이용하면 디지털 적으로 거의 모든색상을 표현할 수 있습니다. 따라서 다양한 디지털 기계에서 색을 표현하는


기본 색광으로 사용한답니다.


그렇다면, gray-level-image라는것이 있는데요. 바로 흑색사진을 의미합니다. ( a black-and-whilte image )


일반적으로 흑백사진은 unsigned 8-bit values 로 구성되어있습니다.


8bit 는 표시할 수 있는 경우가 2의 8승 = 즉 256가지 ( 0 ~ 255 ) 입니다. 이 값들에 따라서 흑백의 밝기가 결정됩니다.


wherer 0 corresponds to black. and 255 corresponds to white.


0이 흑, 255가 백으로서 bit수가 올라갈수록 점점 밝아진다고 생각하면 됩니다.



컬러 이미지는 아까전에 RGB를 설명 했습니다. three primary color channels ( red , green , blue ) 를 이용하여


사람이 인지하는 대부분의 색상을 표현 가능 합니다. 각각의 값들마다 unsigned - 8bit를 가지게 되며,


컬러를 표현한는데는 총 unsigned - 24bit가 필요하게 됩니다.


gray-level-image pixels

0

255 

125 

255

50 

0

6

100


color image pixels

(0,255,0)

(0,255,255)

(255,0,0) 

(100, 0, 100) 

(24, 159, 205) 

(255, 0, 0)

(12, 52, 100) 

(12, 12, 100) 

(0, 0, 255) 






자 이제, 그렇다면 opencv를 이용해서 컬러 이미지를 흑백 이미지로 바꾸어 보도록 하겠습니다.


#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

void main()
{
      cv::Mat image = cv::imread("1204.jpg");
      cv::namedWindow("My Image");
      cv::imshow("My Image", image);
      cv::Mat gray_image;

      
      cv::cvtColor(image, gray_image, CV_BGR2GRAY);

      cv::namedWindow("Output Image");
      cv::imshow("Output Image", gray_image);

      cv::waitKey();
}


다음과같은 코드를 실행 시키면 아래 사진처럼 결과가 나오게 됩니다.






cvtColor는 imgproc.hpp에 포함되어 있습니다.


cv::cvtColor(image, gray_image, CV_BGR2GRAY) 이런 구조로 사용하게 되며


순서대로 ( 원본이미지가저장된변수 , 그레이이미지를저장할변수 , 타입(여기서는BGR2GRAY) )로 구성되어 있습니다.



by 아발로온v 2014.04.07 03:15
| 1 2 3 4 5 6 |