반응형

우선 사칙연산을 수행해주는 arith8이라는 이름의 모듈을 하나 만들어주자.

 

 

a와 b를 입력으로 받아 각각의 사칙연산 결과를 출력으로 내보내주는 모듈이다.

 

회로의 규모가 커지게 되면 하나의 모듈로 처리하기에는 적합하지 않은 경우를 만나게 되는데

이때 설계할 내용을 기능적인 측면과 회로의 양을 감안하여 하나의 모듈이 지나치게 커지지 않도록

적절한 크기로 분할하여 처리할 필요가 있다.

 

위의 그림은 a,b 입력을 받고 사칙연산을 수행하여 출력하는 과정을 도식화하여 나타낸 것이다.

 

앞에서 작성한 코드는 위의 그림에서 사각형으로 나타내어진 arith8.v에 해당한다.

 

그럼 위의 그림에서 나타내어진 것과 같이 din_a, din_b의 입력을 받아 최종적으로 y_out의 출력을 갖는

구조를 나타낼 때 이미 만들어진 arith8 모듈을 사용하여 위의 그림처럼 나타내어 보자.

 

 

가장 먼저 큰 모듈인 arith8_core 모듈을 만들어주자.

이는 입력은 din_a, din_b, sel 을 갖고 출력으로 y_out을 갖고 있다.

 

그 다음 y_a, y_s, y_d, y_m 들을 선언해주는데 바로 아래에 arith8 모듈을 상위모듈로 하여

하위모듈인 u_arith8_0 모듈을 만드는 것을 볼 수 있다.

 

상위모듈인 arith8.v 에서 입력인 a와 b는 하위모듈에서 din_a, din_b로 맵핑해주고

상위모듈에서의 y_add는 하위모듈에서 y_a 로 맵핑, 그리고 이러한 방식으로 맵핑이 진행되게 된다.

 

그리고 그 다음 맵핑된 y_a, y_s, y_d, y_m을 이용하여 MUX를 구성한 것을 볼 수 있다.

 

즉 arith8_core 모듈은 결론적으로 din_a, din_b, sel의 입력, y_out의 출력을 갖는 모듈인데

이를 표현하기 위해 arith8 모듈을 사용하였다.

arith8모듈은 입력이 a, b 이고 출력이 y_add, y_sub, y_mul, y_div인 모듈인데

이를 arith8_core에서 사용할 것이기에 맵핑을 통해 맞춰주는 과정이 필요하게 된다.

 

입력은 arith8_core의 입력과 arith8의 입력이 동일하게 사용되므로

.a (din_a), 

.b (din_b),    와 같이 a와 b를 din_a, din_b 로 맵핑해주었고

arith8 모듈의 출력을 표현하고 다루기 위해서 y_a, y_s, y_d, y_m 신호를 만들어주어

사용하고 이를 통해 결과적으로 y_out의 출력을 나타내고 있다.

 

(참고로 하위모듈 이름이 u_arith8_0 인 이유는 arith8모듈의 under이라 u가 붙고 0번째, 1번째... 와 같이

순서대로 진행될 수 있기에 0을 붙여준다. 즉 arith8의 0번째 하위모듈이란 뜻을 담고 있다.)

 

 

 

시뮬레이션을 실행하면 위와 같이 출력되는 것을 확인할 수 있다.

 

위의 Restart를 눌러준 후

시뮬레이션 파일을 저장해준다.

 

그리고 openfile을 이용하여 tcl파일을 열어주고

 

아래와 같이 코드를 작성한 후 저장하여 준다.

 

작성이 완료되었으면

이렇게 tcl파일이 있는 경로로 이동한 후

source 모듈명.tcl  입력

 

그럼 위와 같이 아름다운 시뮬레이션 결과가 출력된다.

반응형
반응형

Minized를 사용하여 출력포트를 설정하고

해당 포트로 일정한 pulse가 출력되는 시스템을 구현한다.

 

 

우선 프로젝트를 하나 생성해준다.

 

 

RTL Project로 설정하여 주고

 

 

Add Constraints 에서 Minized에 해당되는 .xdc 파일을 선택하여 준다.

해당 파일은 Minized의 각각의 포트들에 대한 정보가 담겨있는 파일이다.

 

마지막으로 Default Part에서 MiniZed 보드를 선택하여 준다.

 

 

최종적인 프로젝트 환경은 아래와 같다.

 

 

그 후 가장 좌측에 보이는 IP INTEGRATOR 에서 Create Block Design을 선택하여 준다.

 

 

Design Name을 설정하면 아래와 같은 창이 뜨게 되는데 여기서 가운데의 (+) 를 클릭하여 IP를 추가하도록 한다.

 

그럼 아래와 같이 검색이 가능한 창이 뜨게 되고 여기서 zync를 입력하여 Zynq7 Proces

sing System IP를 추가하여 준다.

 

그 후 위의 'Run Block Automation' 을 실행시켜준다.

 

 

 

그럼 아래와 같이 포트들이 생성되고

위와 같은 과정으로 Processor System Reset IP를 추가하여준다.

 

 

그 다음으로는 클럭을 설정해주어야 한다.

 

processing_system7_0 을 더블클릭하면 아래와 같은 창이 뜬다.

여기서 Clock Configuration을 클릭해주고

 

 

첫번째 체크박스인 FCLK_CLK0 만 체크하여 50MHz의 주파수만을 갖도록 해주자.

 

 

그럼 이제 소스코드를 생성해주자.

 

Create Design Source

 

 

이렇게 모듈을 생성하였으면

Diagram에서 Add Module을 통해 위에서 소스코드를 통해 만든 모듈을 넣어준다.

소스코드를 만들 때 입출력 포트를 설정해주었으므로 아래와 같이 뜨게 된다.

 

회로는 아래와 같이 설정한 후 logic_out[7:0] 부분을 우클릭 하게 되면 아래와 같이 창이 뜨게 된다.

 

create port를 선택하여 준다.

 

 

그 다음 Sources 목록의 pulse_test를 우클릭하여 Create HDL Wrapper 을 선택

 

아래의 창이 뜨면 두번째 항목인 Let Vivado manage wrapper and auto-update를 선택한 후 OK

 

 

그럼 이제 아까 만든 모듈의 소스코드로 돌아가 코드를 작성하여 준다.

pulse의 소스코드로 들어가서 아래 내용을 입력해준다

 

그 후에는 .xdc 파일로 이동하여 Minized의 어떤 포트에서 출력신호를 가질지 정해주면 된다.

 

 

그 다음 Run Synthesis와 Run Implementation, Generate Bitstream을 순차적으로 진행해주면 된다.

 

BitstreamGenerator 까지 완료되었으면 Hardware Manager을 실행시킨다.

 

그리고 좌측 항목에서 Open Target, Auto Connect 를 선택

 

그럼 아래와 같이 내 보드가 뜨는 것을 확인할 수 있고 이를 선택하면

다음과 같이 프로그래밍이 진행되게 된다.

 

 

그리고 해당 포트의 출력신호를 확인해보면

위의 사진과 같이 각각 다른 주파수를 갖는 디지털 신호들이 출력됨을 확인할 수 있다.

반응형
반응형

 

OV7670 카메라 모듈의 핀은 위와 같이 나타나 있다.

 

SCL과 SDA는 SCCB 통신을 위한 핀으로

SCL은 input Port, SCCB 인터페이스 제어 클럭을 입력받는 핀이고

SDA는 InOut Port로 통신을 위한 데이터를 전송하고 전송받는 핀이다.

 

 

MCLK는 시스템 클럭으로 Input Port이고 여기에 입력되는 클럭을 통해 이미지 데이터를

D0~D7로 출력하고 픽셀클럭(PCLK)를 출력하게 된다.

 

 

 

 

위 이미지는 OV7670 카메라 모듈의 Functional Block Diagram(FBD) 이다.  XCLK핀에 클럭 신호를 입력해주면

이를 기반으로 Video Timing Generator에서 VSYNC, HSYNC, PCLK 신호를 출력해준다.

 

 

그럼 우선 SBBC 통신을 통해 데이터를 받아오기 위한 설정부터 진행해보자.

일단 왜 SBBC 통신을 쓰는지, SBBC통신의 장점을 간단히 적자면

SBBC통신(I2C통신)은 시리얼통신과 다르게 동기화 통신방식을 사용하여 통신속도를 따로 정해주지 않아도 되고

클럭신호를 통해 데이터의 전송  타이밍을 맞추게 된다.

(그리고 많은 센서를 동시에 편하게 연결할 수 있다고 한다.)

 

 

위의 그림은 I2C 통신을 나타내는 그림으로 다음 두 그림을 참고하여 설명하겠다.

 

 

 

SDA신호와 SCL신호는 모두 풀업저항에 의해 초기에 HIGH상태를 유지한다.

 

그리고 SDA신호가 LOW로 떨어지게 되면 데이터 전송을 시작하게 되고 그 이후 클럭신호(SCL)에 맞춰

데이터 전송이 진행된다.

 

Device Address의 데이터 전송이 끝났으면 Read/Write 데이터를 전송하고 쓰기모드일 경우

데이터가 잘 전송되었는지는 Slave측의 ACK 신호를 통해 확인하게 된다. 

 

그리고 난 후 SCL이 LOW신호일 때 다음 데이터인 Register Address 데이터 전송을 위해 data값을 바꾸고 위의 내용들을 반복하여 진행하게 된다.

 

 

 

위의 그림에서 SDA신호가 0이 되면 통신 시작

-> 그 다음 SCL이 0이 되는 순간부터 데이터 전송

-> 8개 비트 데이터(7bit Address, 1bit R/W) 전송

-> ACK확인

-> 그 다음 데이터 전송

-> ...

 

을 진행하게 된다.

 

위는 PCF8574A 라는 장치의 Address에 A0앞에 R/W의 정보가 담기는 것을 확인할 수 있다.

 

즉 Address 안에 R/W 정보를 담고 있는 것이다.

 

 

OV7670.pdf
0.84MB

 

 

 

위 파일은 OV7670의 메뉴얼 파일이다.

 

 

메뉴얼을 보면 위와 같이 Register을 설정해주는 부분이 보이는데 이 부분에 대한 설정 값들을 SBBC 통신을 통해

진행하게 된다. 즉 위의 설정값을 통해 어떠한 데이터를 받아올 것인지 설정해주게 된다.

 

 

OV7670_config_rom.v
0.00MB

 

 

 

위 파일이 Register에 대한 값들을 설정해주기 위한 값들을 담고있다.

 

 

위의 addr값이 0 일때의 조건문을 보면

dout 값에 16'h1280 의 값을 넣어주는 것을 확인할 수 있다.

 

이는 Register의 12번 주소에 0x80 이라는 값으로 설정해주겠다는 의미이다.

 

SCCB.zip
0.01MB

 

 

위의 파일은 SCCB 통신을 위한 코드가 담긴 파일이다.

 

Camera_configure 모듈을 살펴보면 입력으로

CLK, start, RST가 존재하고 출력신호로 SIOC, SIOD, done 신호가 존재한다.

 

내부적으로는 config 모듈과 SCCB_Interface 모듈, ROM 모듈이 존재하며

이들과의 관계를 통해 결과적으로 SIOC, SIOD 출력을 내보내게 되고

이를 통해 카메라모듈과 통신을 진행하게 된다.

 

start신호는 임의로 만들어주었다.

 

ZedBoard에서 출력되는 신호는 100MHz의 클럭이 출력되므로

아래와 같이 clock_divider 이라는 모듈을 만들어 100MHz 신호를 1MHz로 바꿔주어 출력하고 이를 Configure 모듈로 입력하여 통신을 진행하도록 한다.

 

또한 start신호는

 

위와 같이 cnt가 200보다 작을때는 계속 증가시키고

200이 되는 순간 start를 1로, 201이 되면 다시 start를 0으로 하고 cnt가 증가하지 않도록 함으로서

순간적인 start신호를 만들어 주었다.

 

clock_divider.v
0.00MB

 

 

 

 

그리고 난 후 이를 minized 보드에 입히고

실행시키면 Camera Module에서 pixel clock과 함께 데이터 신호들이 나오고 있는 것을

오실로스코프를 통해 확인할 수 있다.

 

 

 

 

위의 D0신호는 카메라 모듈의 Vsync, D1은 HSync,

D2~D5는 Image Data를 의미한다.

 

확인해보면 조금 이상하긴 하지만 HSync가 멈추는 사이사이 Vsync가 1이 되면서 프레임완료 신호를 출력하는 것을

확인할 수 있다.

 

 

그리고 Href 가 High인 상태에서 각각의 데이터 신호들이 전달되는 것을 확인할 수 있다.

 

 

그럼 XCLK로 몇 Hz의 신호를 주어야 할까?

 

Hacking the OV7670 camera module (SCCB cheat sheet inside)

An in-depth look of the OV7670 camera module The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640...

embeddedprogrammer.blogspot.com

위의 블로그를 참고하면 30fps의 경우 24MHz의 클럭을 입력하여야 한다고 한다.

 

 

*******************************************************************

하지만 통신이 완료되면 done신호가 1이 되어 출력되어야 할 것 같은데 이는 아직 출력되지 않고 있다.

 

이를 확인해볼 필요가 있다.

 

반응형
반응형

베릴로그를 공부하다보면 플립플롭과 래치, 순차회로, 조합회로에 관한 얘기가 많이 나오게 된다.

 

* 순차회로, 조합회로

간단하게 이전 입력을 기럭하는 부분이 있는 회로라면 순차회로, 이전 입력을 기억하지 않는다면 조합회로로

볼 수 있다.

 

 

위의 경우 A,B,C,D의 입력값들에 의해 출력 T가 결정되게 된다. 이는 조합회로로 볼 수 있다.

다음은 순차회로이다.

위의 회로는 A값에 1이 한번 입력되게 되면 T값은 계속 1을 출력하게 된다.

A에 1이 들어가게 되면 OR게이트이므로 무조건 1을 출력하게 되고 T는 1, 그리고 이 값이 다시 OR게이트에

입력으로 들어가게 된다. 이 때 A값이 0으로 바뀌었다고 해도 이전의 값이 1이었기에 T는 계속해서 1이 출력되게

된다. 

 

1비트의 정보를 저장하는 회로를 플립플롭(flip-flop)이라 한다.

 

 

위의 그림은 SR플립플롭을 도식화 한 것이다.

 

우선 S값에 0, R값에 1이 입력되었다고 가정해보자.

R값은 1이기에 NAND게이트를 통해 0이 출력되게 되고

이는 다시 NAND를 통해 1이 출력되어 Q'은 1이 출력되게 된다.

그리고 S는 0이기에 NAND를 통해 1이 출력되고 이는 다시 NAND를 통해

위에서의 Q'값 1을 통해 Q는 0이 출력되게 된다.

 

그리고 S와 R 신호 모두 0이 되면 이전의 상태를 유지하게 된다.

 

그럼 S값에 1, R값에 0이 입력된다고 보면

S의 NAND는 0이 출력되고 되고 다시 NAND의 입력으로 들어가게 되어 Q로 1이 출력되게 된다.

그리고 R은 0이기에 NAND를 통해 1이 출력되게 되고 이는 다시 Q신호 1과 함께 NAND로 들어가  

Q'은 0이 출력되게 된다.

 

그리고 이 또한 S와 R 신호 모두 0이 되면 이전의 상태를 유지하게 된다.

참고로 S나 R 신호 중 하나가 1로 되지 않은 상태에서 S와 R 신호 모두 0이 되게되면 에러가 발생하게 되고

두 신호 모두 1이 되게 되면 출력은 Q와 Q' 모두 0이 되게 된다.

 

 

 

위는 SR Latch의 이미지인데 보면 플립플롭과 다르게 CP신호가 없음을 확인할 수 있다.

 

즉 Latch와 F/F의 차이는 클럭입력을 가하게 되면 F/F

클럭입력을 가하지 않으면 Latch로 볼 수 있다.

 

 

 

이를 순차회로라고 하고 플립플롭과 래치는 이러한 방식으로 값을 저장하게 되는 것이다.

 

 

반응형
반응형

다양한 방법을 해봤는데 어려운 내용이 많고 복잡한 것 같아 간단하게 정리해둔다.

 

우선 내pc의 설정을 들어가 아래 이미지와 같이 원격설정에 들어가준다.

 

그리고 아래와 같이 설정해준다.

 

 

 

다음은 방화벽 설정이다.

 

 

 

 

시작 부분에서 위와 같이 방화벽을 검색한 후 "방화벽 상태 확인" 실행

 

 

위와 같이 설정해준다.

 

다음은 인터넷 부분인데

와이파이 호스팅 주소로 들어가서 와이파이 설정에 들어가 DMZ에 현재 내 pc의 192주소를 입력해주면 된다.

 

고정 IP를 사용해야하는 것 아닌가 싶엇는데

유동으로 해도 일단은 잘 된다.

반응형
반응형

Vivado 첫 화면은 다음과 같다.

 

여기서 가장 위의 Create Project를 선택

 

 

프로젝트 이름과 경로를 설정하고 NEXT

 

 

위의 화면에서 일단 나는 장비 없이 간단한 코드들만 실행시켜보면서 시뮬레이션 돌려볼 것이므로

그냥 NEXT를 눌러 진행한다.

Constraint는 사용할 보드의 구조를 담고있는 파일을 말하는 듯 하다.

 

 

이 부분도 현재 보드가 없으므로 그냥 NEXT

 

 

 

위와 같이 설정 Summery가 확인되는데 source파일을 추가해주지 않았고 constraints 파일을 지정해주지 않았기에

위와 같은 알림이 뜨게 된다.

 

그리고 마무리를 하면 다음과 같은 창이 뜨게된다.

 

 

위의 Design Source부분에서 Add Source를 선택하여 소스코드를 넣어주자.

 

 

 

위와 같이 Create File 클릭 수 File name과 File Type을 설정해준다.

 

이렇게 test.v 라는 파일이 생성되게 된다.

여기서 test라는 Module의 입출력 포트를 지정해주게 된다.

 

하지만 나는 여기서 설정하는 것 보다 나중에 코드로 설정하는게 더 편하므로(개인적으로)

여기서는 그냥 OK를 눌러 진행한다.

 

 

위와 같이 test라는 파일이 만들어지고 또 test라는 모듈이 만들어진 것을 확인할 수 있다.

 

위와 같이 간단한 AND게이트를 만들어보자.

 

코드로 작성한걸 회로로 보기 위해 좌측 RTL ANALYSIS 항목의 Schematic 선택 후 다음과 같이 진행

 

위와 같이 a,b를 입력으로 받고 c를 출력으로 갖는 AND게이트가 나타나게 된다.

 

그럼 시뮬레이션을 통해 더 작업을 진행해보자.

우측의 SIMULATION 항목에서 Run Simulation 진행

그리고 Run Behavioral Simulation 진행

 

위와 같이 뜨는데 a, b 에 아직 값을 안정해줬기에 Z 라는 이상한 값이 들어가있고

출력을 나타내는 c에도  X 라는 이상한 값이 들어가있다.

 

그렇기에 입력의 a, b에 값을 넣어줘보자.

 

위의 사진에서 가장 좌측 상단의 아이콘을 누르면 시간이 0ps로 이동하는 것을 확인할 수 있다.

 

그리고 상단의 시간을 표현하는 부분에 1 us 를 선택해주자.

 

위와 같이 a의 값에 Force Constant를 통해 0이라는 Force Value를 넣어주고 OK

 

똑같이 b의 값에도 0을 넣어주자.

 

위와 같이 0이라는 Value가 제대로 들어간 것을 확인할 수 있다.

 

그럼 상단 시간을 표현하는 부분에 (T)라고 쓰인 아이콘을 클릭

 

0us부터 시간을 표현하는 부분에 적어준 1us까지 지정해준 값을 통한 출력값 c가 표현된다.

 

이렇게 진행해보면 입력값에 따른 결과값이 표현되는 것을 확인할 수 있다.

 

여기까지 완전 기초로 초등학생도 따라할 수 있는 과정이였다.

중간중간 설정이 의미하는게 어떤건지,

좀 더 디테일한 과정을 진행하기 위해선 어떻게 해야하는지

앞으로 차근차근 정리해보겠다.

반응형
반응형

MUX는 다양한 입력신호를 갖고 select 신호에 따라 어떠한 입력을 출력할 것인지 선택하게 된다.

 

https://netpilgrim.net/460

즉 위와 같이 나타낼 수 있으며 S0와 S1의 신호에 따라 어떠한 입력신호를 출력할 것인지 결정하게 된다.

 

이를 Verilog 코드로 표현하면 아래와 같다.

 

mux1 이라는 모듈을 만들었는데 입력은 d0, d1의 신호와 어떠한 입력을 출력할 것인지 선택하는 sel 신호가 있다.

 

출력신호 y1부터 보자.

 

sel값이 0이면 d1값은 무시되고 ~(sel)을 통해 d0의 값이 출력되게 된다.

반대로 sel값이 1이면 ~(sel)값은 0이 되어 d0가 무시되고 d1의 신호가 출력신호가 된다.

 

y2는 물음표 기호가 들어가게 된다.

이는 조건에 따른 동작을 선택할 때 사용되고

형식은 다음과 같다.

 

(판단문) ? [참일 때의 선택] : [거짓일 때의 선택];

 

즉 위의 예로 보면 sel은 0인가?   참이면 y2는 d0신호, 거짓이면 y2는 d1신호

라는 뜻을 담고 있다.

 

그럼 다음 예제를 보자.

 

d0부터 d3까지 4개의 입력신호를 갖고 있으므로 4개를 선택할 수 있도록 2bit 크기의 sel 신호가 선언되었다.

하지만 아래 assign의 판단문을 보면 거짓일때의 선택항복이 비어있는 것을 볼 수 있다.

 

이는 거짓일 경우에 대해서 새로운 조건에 대한 판단을 할 수 있도록 가능성을 열어둔 것이다.

즉 sel이 0인가? 맞다면 d0출력

sel이 0이 아닌가?  그럼 sel이 1인가? 맞다면 d1 출력

이렇게 뒤의 내용들이 이어진 것으로 볼 수 있다.

반응형
반응형

[Hough Transform을 통한 직선 검출]

 

x-y 평면 위에 임의의 점 P1이 있다고 하자.

이 점 P1을 지나는 직선은 무수히 많이 존재하게 된다.

[그림.1]

그럼 이 수많은 직선들 중 하나를 표현해보자.

 

[그림.2]

우리는 흔히 이 직선을 y=ax+b 로 나타낼 수 있을 것이다.

이는 기울기 a와 y절편 b를 이용하여 x값이 변화할 때의 y값을 나타내는 것이다.

 

하지만 우리는 특정한 점 P1(x1, y1)을 지나는 직선들을 표시하고 싶다.

즉 a와 b의 값을 정해놓고 x를 변화시키며 y값을 찾고싶은 것이 아닌

x와 y를 (x1,y1)으로 그 점을 지나는 모든 직선들을 식으로 나타내고자 한다.

 

따라서 임의의 직선에서 원점으로 수직한 선을 그리고 그 선의 길이 r와 그때의 선과 x축과의

각도 theta를 이용하여 P1을 지나는 무수한 직선들을 표현하여 보자. 

 

[그림.3]

위의 그림을 통해 알 수 있듯이 r=x1Cos(theta)+y1Sin(theta) 로 표현될 수 있다.

이 부분에 대해서도 이해가 되지 않을 수 있으니 간단하게 설명하고 넘어가도록 하겠다.

 

[그림.3]에서 붉은 선은 임의의 직선 y=ax+b와 수직이면서 x축과의 각도가 theta이다.

이를 이용하여 r을 구해보자.

 

 

[그림.4]

위와 같이 나타낼 수 있을 것이고 여기서

r=x1Cos(theta)+y1Sin(theta) 가 성립됨을 확인할 수 있다.

 

이제 위의 식을 x와 y에 대하여 나타내는 것이 아닌 r과 theta의 값에 대하여 나타내어 보자.

즉 기존의 x축, y축을 r축과 theta축으로 바꾸는 것이다!

 

x축을 theta축으로 놓고 y축을 r축으로 놓으면

r=x1Cos(theta)+y1Sin(theta) 의 식을 통해 r값이 삼각함수의 합성된 sin파 형태가 나올 것임을 예측할 수 있다.

 

[그림.5]

즉 그림.5와 비슷한 형태의 그래프를 나타내게 된다.

 

그럼 다시 처음으로 돌아가보자.

 

우리는 x-y 좌표 위의 임의의 점 P1에 대하여 그 지점을 지나는 무수한 직선들을 r과 theta를 이용하여 나타내었다.

 

그럼 x-y좌표계 위에 있는 또 다른 점 P2에 대하여 생각해보자.

[그림.6]

점 P2 역시 이 점을 지나는 직선은 무수히도 많을 것이고 P2(x2, y2)의 점을 지나는 그 무수한 직선들은

위와 같은 방법으로

 

r=x2Cos(theta)+y2Sin(theta)  로 나타낼 수 있다.

 

[그림.7]

즉 위의 그림의 빨간색 선은

r=x1Cos(theta)+y1Sin(theta) 의 그래프와

r=x2Cos(theta)+y2Sin(theta) 의 그래프를 나타낸 것으로 볼 수 있고 여기서 x축은 theta, y축은 r값임을

알 수 있다.

 

그럼 여기서 두 그래프가 만나는 교차점은 무엇을 의미할까?

 

여기서 두 그래프의 교차점은 r값과 theta값이 서로 같나는 것을 의미하고 이는 x-y평면 위의 두 점

P1(x1, y1) 과 P2(x2, y2) 가 한 직선 위에 있다는 것으로 해석할 수 있다.

(두 그래프가 아예 같아 겹치게 되면 P1과 P2는 같은 점이 될 것이다)

 

그리고 위의 그래프는 2*(pi) 를 주기로 반복될 것이고 따라서 2*(pi)를 주기로 교차점의 위치는 반복될 것이다.

따라서 우리는 뒤에 이어지는 주기는 신경쓰지 말고 0~2*(pi)까지의 범위 안에서만 보도록 하자.

 

0~2*(pi) 안에서 총 2번 접점이 생기는 것을 확인할 수 있다

[그림.8]

이는 P1에서 P2로의 직선을 나타내는 교점 1개와 P2에서 P1으로의 직선을 나타내는 교점 1개 이므로

0~2*(pi) 사이에 총 2개의 접점이 생기는 것이고 각각의 접점은 pi 주기로 생기게 될 것이다.

 

그럼 r-theta 평면의 그래프에서 한 접점에 굉장히 많은 삼각함수 곡선들이 겹치게 되면 어떨까?

 

이는 많은 점들이 한 직선 위에 있다는 것으로 해석할 수 있고 몇개의 곡선들이 한 접점에 모였을때 그 선을 직선인지

판단할지는 opencv 함수 중 HoughLinesP() 함수의 Threshold 값으로 지정해주게 된다.

 

즉 Threshold값을 100으로 지정하였다면 100개의 점이 한 직선위에 있을 때 그 직선을 검출하겠다는 의미가 된다.

 

바로 다음 게시물로 Hough Transform 을 이용한 원 검출 방법에 대해 써보겠다.

반응형

+ Recent posts