c# 윈폼 gpu μ—°μ‚°?

μ΄λ²ˆμ— ν”„λ‘œκ·Έλž¨ ν•˜λ‚˜λ₯Ό κ°œλ°œν•΄μ•Ό ν•˜λŠ”λ°μš”β€¦
κΈ°κΈ°λž‘ μ‹œλ¦¬μ–Ό 톡신을 ν†΅ν•΄μ„œ 데이터λ₯Ό 계속 λ°›μ•„μ˜΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ κ·Έ 데이터λ₯Ό 기반으둜 이와 같은 화면을 λ§Œλ“€μ–΄μ•Ό ν•˜κ±°λ“ μš”.

image

격자 λ¬΄λŠ¬λŠ” ν•„μš” μ—†κ³  μ € 색깔 ν‘œν˜„μ„ ν•΄μ€˜μ•Ό ν•˜λŠ”λ° μ–΄λ–»κ²Œ ν•΄μ•Όν• μ§€ λ§‰λ§‰ν•˜λ„€μš”.
일단 κ²€μ€μƒ‰μœΌλ‘  ν‘œμ‹œλ₯Ό 해보긴 ν–ˆλŠ”λ° FillRectangle ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ κ·Έλƒ₯ μž‘μ€ λ„€λͺ¨λ‘œ ν‘œν˜„μ„ ν•˜λ‹€λ³΄λ‹ˆ 이미지와 같이 λΆ€λ“œλŸ½κ²Œλ„ μ•ˆλ˜κ³  색깔은 μ–΄μ°Œμ €μ°Œ ν• κΊΌκ°™μ§€λ§Œμš”β€¦

일단 κ΅¬ν˜„ν•΄μ•Ό λ˜λŠ”κ±΄ μ €λŸ° ν™”λ©΄μž…λ‹ˆλ‹€. 데이터 값은 ushort[48, 128]둜 μ’Œν‘œ 처럼 λ„˜μ–΄μ˜€λ©° 값은 0~255둜 λ“€μ–΄μ˜΅λ‹ˆλ‹€.

μ €λŸ° 화면을 κ΅¬ν˜„ν•˜λŠ”λ° 참고될 λ§Œν•œκ²Œ μžˆμ„κΉŒμš”?

그리고 일단 λŒ€μΆ©μ΄λΌλ„ λ§Œλ“€κΈ΄ ν–ˆλŠ”λ°μš” . 이게 μ‹€μ‹œκ°„μœΌλ‘œ 데이터가 많이 λΉ¨λ₯΄κ²Œ λ“€μ–΄μ™€μ„œ 쑰금 λž™μ΄ κ±Έλ¦¬λŠ” λŠλ‚Œμ΄ μžˆλ„€μš”. μ’€ μ•Œμ•„λ³΄λ‹ˆ gpu 연산을 μ΄μš©ν•˜λŠ” 방법도 μžˆλ‹€λ˜λ° κ΅­λ‚΄μ—” μžλ£Œκ°€ λ„ˆλ¬΄ μ—†λ„€μš”. μžˆμ–΄λ„ λ„ˆλ¬΄ μ˜›λ‚ κΊΌκ³ μš” γ… γ… . ν˜Ήμ‹œ gpu 연산은 μ–΄λ–€κ±Έ μ•Œμ•„λ³΄λ©΄ λ κΉŒμš”?

2개의 μ’‹μ•„μš”

이미지 ν”„λ‘œμ„Έμ‹±μ— κ΄€λ ¨λœ μ˜μ—­μ΄κ³ μš”.
μ§ˆλ¬Έν•˜μ‹  λ‚΄μš©μ€ GPUν•˜κ³ λŠ” 1도 관계 μ—†μŠ΅λ‹ˆλ‹€.
GPUκ°€ ν•„μš”ν•œ κ²½μš°λŠ” 데이타가 크고 고속 연산이 ν•„μš”ν•œ κ²½μš°μž…λ‹ˆλ‹€.

질문의 λ‚΄μš©μ€ μ†Œκ·œλͺ¨ 데이타가 λΉ λ₯΄κ²Œ λ“€μ–΄μ˜€λŠ”λ°.
κ·Έκ±Έ λΉ λ₯΄κ³  이쁘게 그리고 μ‹Άμ€κ±°μž–μŠ΅λ‹ˆκΉŒ?

이미지 ν”„λ‘œμ„Έμ‹±μœΌλ‘œ μ•Œμ•„λ³΄μ…”μ•Ό ν•˜λŠ”λ°μš”.
μ•„λ§ˆ μ—”κ°„ν•œ κ³³μ—μ„œλŠ” λ‹΅λ³€ 잘 μ•ˆλ‚˜μ˜¬ κ²λ‹ˆλ‹€. μ›Œλ‚™ μ „λ¬Έ μ˜μ—­μ΄λΌ
질문이 ꡬ체적이지 μ•ŠμœΌλ©΄ λ‹΅λ³€ 잘 μ•ˆλ‹¬λ¦½λ‹ˆλ‹€.

3개의 μ’‹μ•„μš”
  1. 윈폼
  2. μ‹œλ¦¬μ–Όν†΅μ‹ 
  3. μ‹€μ‹œκ°„μœΌλ‘œ λ§Žμ€ 데이터가 μˆ˜μ‹ λ¨

일단 1번 μ‘°κ±΄μ—μ„œ gpuν™œμš©ν•˜λŠ”κ±΄ λ§Žμ€ μ œμ•½μ΄ λ”°λ₯Έλ‹€λŠ” 건 μ•„μ‹€κ±° 같고…(wpfλ₯Ό 닀룰쀄 μ•„μ‹ λ‹€λ©΄ wpfκ°•μΆ”ν•©λ‹ˆλ‹€)
2번 쑰건을 보면 μ‹œλ¦¬μ–Όν†΅μ‹ μ΄ μ•„μ‹œλ‹€μ‹œν”Ό 이벀트 κΈ°λ°˜μ΄μž–μŠ΅λ‹ˆκΉŒ? κ·Έλž˜μ„œ μ΄λ²€νŠΈμˆ˜μ‹ κ³Ό λ™μ‹œμ— ui처리λ₯Ό ν•˜λ €λ©΄ λ‹Ήμ—°νžˆ 3번의 μƒν™©μœΌλ‘œ 인해 보틀λ„₯이 무쑰건 생길 수 밖에 μ—†λŠ”λ°μš”.

μ™œλƒν•˜λ©΄ data recieve μ΄λ²€νŠΈμ—μ„œ μŠ€λ ˆλ“œκ°€ μž‘ν˜€μžˆλŠ” μƒνƒœμ—μ„œ uiλ₯Ό 미처 λ‹€ μ²˜λ¦¬ν•˜κΈ°λ„ 전에 이미 μ‹œλ¦¬μ–Ό λ²„νΌμ—λŠ” 데이터가 μŒ“μ΄κ³  μžˆλŠ” μƒν™©μ΄κ±°λ“ μš”β€¦

μ—¬κΈ°μ„œ μš°λ¦¬κ°€ μΈμ •ν•˜κ³  λ„˜μ–΄κ°€μ•Όλ κ²Œ, μœˆνΌμ—μ„œλŠ” λ™μ‹œμ— μ•„μ£Ό λ§Žμ€ 데이터가 λΉ λ₯΄κ²Œ ν†΅μ‹ μœΌλ‘œ λ„˜μ–΄μ˜¬ κ²½μš°μ— κ·Έ 데이터λ₯Ό ν•œκΊΌλ²ˆμ— μ²˜λ¦¬ν•  μˆ˜κ°€ μ—†λ‹€λŠ”κ²λ‹ˆλ‹€.
(λ³΄λ ˆμ΄νŠΈκ°€ λ†’μ„μˆ˜λ‘ λ”μš± κ·ΈλŸ¬ν•˜μ§€λ§Œ, 만일 λ³΄λ ˆμ΄νŠΈκ°€ 9600 정도라면 보틀λ„₯이 κ·Έλ ‡κ²Œ 생길것 κ°™μ§„ μ•Šλ„€μš”)

μ œκ°€ μ €λŸ° ν”„λ‘œκ·Έλž¨μ„ λ‹€λ£¨κ±°λ‚˜ μž‘μ„±ν•  λ•ŒλŠ” 톡신 μˆ˜μ‹ λΆ€μ™€ uiμ²˜λ¦¬λΆ€λ₯Ό λΆ„λ¦¬ν•˜λŠ” 방식을 νƒν•˜λŠ” νŽΈμž…λ‹ˆλ‹€.
데이터 μˆ˜μ‹ μ€ λ§‰νž˜μ—†μ΄ ν•˜κ³ , uiλ₯Ό 쑰금 늦게 μ²˜λ¦¬ν•˜λŠ”κ±°μ£ . (μ‹€μ œλ‘œλŠ” ν™”λ©΄ 반영이 λŠλ¦¬λ‹€λŠ” λŠλ‚Œλ„ λ³„λ‘œ 없을듯)
μΌμ’…μ˜ 버퍼λ₯Ό λ§Œλ“€μ–΄λ‘κ³  데이터 μˆ˜μ‹ ν•˜λ©΄ κ·Έ 버퍼에 데이터λ₯Ό μŒ“μ•„λ‘‘λ‹ˆλ‹€.
κ·Έλ¦¬κ³ λ‚˜μ„œ λ³„λ„μ˜ μž‘μ—… μŠ€λ ˆλ“œλ₯Ό λŒλ €μ„œ(λ°˜λ³΅μ£ΌκΈ°κ°€ 맀우 짧은) uiλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œμš”β€¦(ν•œκΊΌλ²ˆμ— ν˜Ήμ€ λ‚˜λˆ μ„œ)

μ •ν™•νžˆ μ–Όλ§ˆλ‚˜ λ§Žμ€ 데이터λ₯Ό μ–Όλ§ˆλ‚˜ 짧은 주기둜 화면에 ν‘œν˜„ν•˜λŠ”μ§€ λͺ¨λ₯΄λ‹€λ³΄λ‹ˆ 닡변이 λ­”κ°€ ν™•μ‹€ν•˜μ§€κ°€ μ•Šλ„€μš©β€¦γ… 
λΆ€λ”” 잘 ν•΄κ²°ν•˜μ‹œκΈΈβ€¦

5개의 μ’‹μ•„μš”

일단 문제λ₯Ό λ‹€μŒμ²˜λŸΌ λ‚˜λˆ μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

  1. 데이터λ₯Ό μ–΄λ–»κ²Œ ν™”λ©΄μ˜ 그림처럼 ν‘œν˜„ν•  것인가?

그림을 보면 λŒ€μ‘ν•˜λŠ” κ°’κ³Ό 격자 κ°„μ˜ 1:1 ν‘œν˜„μ΄ μ•„λ‹™λ‹ˆλ‹€. κ·Όμ ‘ν•œ 값에 따라 κ°€κ³΅λ˜λŠ” λ“― 보이고
이것은 νŠΉμ • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‚˜ ν”„λ ˆμž„μ›Œν¬μ— μ’…μ†λœ 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—
κ΄€λ ¨λœ 처리λ₯Ό μ‘°μ‚¬ν•˜κ±°λ‚˜ μš”μ²­ν•˜μ…”μ„œ κ°€κ³΅ν•˜λŠ” 방법을 μ°Ύμ•„μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

  1. 화면에 데이터λ₯Ό κ³ μ†μœΌλ‘œ κ·Έλ¦¬λŠ” 방법

μœˆνΌμ—μ„œ Direct2D 그리기λ₯Ό μ‚¬μš©ν•  수 있게 λ„μ™€μ£ΌλŠ” 라이브러리 μ°Ύμ•„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4개의 μ’‹μ•„μš”

1은 λ‹€μŒμ˜ κΈ€ 처럼 λΉ„νŠΈλ§΅ 정보λ₯Ό λ°±ν„°ν™” ν•˜λŠ” 기법을 이용 + κ°€μš°μ‹œμ•ˆ λΈ”λŸ¬λ₯Ό μ΄μš©ν•˜λ©΄ 달성할 수 μžˆμ–΄ λ³΄μž…λ‹ˆλ‹€.

4개의 μ’‹μ•„μš”

λ˜λŠ” μž…λ ₯ 데이터가 μ•„λ§ˆλ„ μ••λ ₯ 데이터일 κ²ƒμ΄λ―€λ‘œ – λ“±κ³ μ„ κ³Ό μœ μ‚¬ν•œ 데이터 νŠΉμ„±μ΄ μžˆμ„ κ²ƒμœΌλ‘œ μΆ”μΈ‘λ˜λ‹ˆ 등고선을 ν‘œν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ‘°μ‚¬ν•˜μ…”λ„ 될 λ“― ν•˜λ„€μš”.

2개의 μ’‹μ•„μš”

@mincook μ‹€μ œ μ‚¬μš©ν•˜μ‹œλŠ” μƒ˜ν”Œ 데이터도 ν•œλ²ˆ μ œκ³΅ν•΄μ£Όμ‹œλ©΄ μž¬λ°Œμ„ 것 κ°™μŠ΅λ‹ˆλ‹€. :smile:

3개의 μ’‹μ•„μš”

였 저도 κ·Έ 생각 ν•˜κ³  μžˆμ—ˆλŠ”λ°β€¦ 데이터λ₯Ό μ–΄λ–»κ²Œ μ‹œκ°ν™” ν•΄μ•Ό 그림처럼 μœ μ‚¬ν•˜κ²Œ λ‚˜μ˜€λ©΄μ„œ μ‰½κ²Œ λ κΉŒβ€¦ μƒκ°μ€‘μ΄μ˜€μŠ΅λ‹ˆλ‹€. κ·Έκ±Έ ν™•μΈν•˜λ €λ©΄ μƒ˜ν”Œ 데이터가 있으면 μ’‹μœΌλ‹ˆκΉŒ! ^^

4개의 μ’‹μ•„μš”

저희 μ‚¬λžŒμ΄ 보기에 νŽΈν•œ λ°©μ‹μœΌλ‘œ ν•˜λ©΄ 이런 μ‹μœΌλ‘œ 데이터가 λ„˜μ–΄μ˜΅λ‹ˆλ‹€.
ν•΄λ‹Ή 뢀뢄은 μ„Όμ„œκ°€ κ°€λ‘œ 48개, μ„Έλ‘œ 128개의 μ„Όμ„œκ°€ μžˆλŠ” 판 μœ„μ— 아령을 μ˜¬λ €λ†“μ•˜μ„ λ•Œμ˜ λͺ¨μŠ΅μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ μ•„λ Ήμ˜ ν˜•νƒœλ‘œ 데이터가 μƒκΈ°λ„€μš”. ν•΄λ‹Ή μ΄λ―Έμ§€μ—μ„œλŠ” 아령이 μ˜¬λ €μ§„ μœ„μΉ˜ λΆ€λΆ„λ§Œ μ œκ°€ μž˜λΌμ„œ κ°€μ Έμ˜¨κ²λ‹ˆλ‹€. μ‹€μ œλ‘  x좕이 48개이며, y좕이 128개 μž…λ‹ˆλ‹€.

0으둜 ν‘œμ‹œλœ 뢀뢄은 μ••λ ₯을 μ•„μ˜ˆ λ°›κ³  μžˆμ§€ μ•Šμ€, 즉 λ¬Όκ±΄μ΄λ‚˜ 힘이 κ°€ν•΄μ§€μ§€ μ•Šμ€ μœ„μΉ˜μ΄λ©° 0 초과인 λΆ€λΆ„λ§Œ μ••λ ₯이 κ°€ν•΄μ§€κ³  μžˆλŠ” λΆ€λΆ„ μž…λ‹ˆλ‹€.

이걸 μ†ŒμŠ€μ—μ„œλŠ” ushort[48,128] 의 데이터 ν˜•νƒœλ‘œ λ„˜μ–΄μ˜΅λ‹ˆλ‹€.

μƒ˜ν”Œ 데이터λ₯Ό 있으면 μ’‹κ² λ‹€κ³  ν•˜μ…”μ„œ μ˜¬λ¦½λ‹ˆλ‹€.

3개의 μ’‹μ•„μš”
  • 저라면 λΈ”λŸ¬λž‘ 이미지 ν‘œμ‹œλ‘œ C#/OpenCVSharp ν˜Ήμ€ C++/OpenCV or OpenGL을 μ“Έ 것 κ°™μŠ΅λ‹ˆλ‹€.
  • 데이터 λ²„νΌμ—μ„œ 색깔이 νΌμ§€λŠ” 효과λ₯Ό μœ„ν•΄ 필터링 1~2회만 ν•˜λ©΄ ν•„μš”ν•œ 연산은 끝날 것 κ°™μŠ΅λ‹ˆλ‹€.
  • μΆ”κ°€λ‘œ μž‘μ—… 할당을 ν•΄μ€˜μ•Όν•˜λŠ” GPU 연산이 ν•„μš”ν•  μ •λ„λŠ” μ•„λ‹Œ 걸둜 λ³΄μž…λ‹ˆλ‹€!

μ•„λž˜λŠ” C#μ—μ„œ μ˜¨λ„λ₯Ό colormap으둜 ν‘œμ‹œν•œ μ˜ˆμ œμž…λ‹ˆλ‹€. μ••λ ₯을 μ•„λž˜ 예제의 μ˜¨λ„λ‘œ μƒκ°ν•˜μ‹œλ©΄ μ°Έκ³ ν•  λ§Œν•  것 κ°™μŠ΅λ‹ˆλ‹€.

쑰금 무거운 라이브러리인데, C#μ—μ„œλ„ μ˜μƒν‘œμ‹œ/μ˜μƒμ €λ¦¬λ₯Ό μ‰½κ²Œ ν•  수 μžˆλŠ” β€˜OpenCV for C#’ opencvsharpλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. WinForm/WPF에 ν‘œμ‹œν•˜λŠ” 것도 μ–΄λ ΅μ§€ μ•Šμ„κ±°μ—μš”

도움이 됐으면 μ’‹κ² μŠ΅λ‹ˆλ‹€

7개의 μ’‹μ•„μš”

@jyje 정말 μ œκ°€ λ”± μ›ν•˜λ˜ λ‚΄μš©λ“€μ΄λ„€μš”. μ°Ύμ•„λ³΄λ‹ˆ OpenCV에 λŒ€ν•œ λ‚΄μš©λ“€λ„ μ’…μ’… λ‚˜μ˜€κ³  λ§μ”€ν•˜μ‹ λ°λ‘œ λΈ”λŸ¬μ™€ ν•„ν„° 효과λ₯Ό μ‚¬μš©ν•˜λ©΄ 될 λ“― ν•˜λ„€μš”. 정말 κ°μ‚¬ν•©λ‹ˆλ‹€.

λ‹€λ₯Έ λ‹΅λ³€ μ£Όμ‹  λͺ¨λ“  λΆ„λ“€κ»˜λ„ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

2개의 μ’‹μ•„μš”