[C/C++] extern "C"

우선 참조한 블로그 들 debug me 님의 extern "C" 제대로 생각해보기 Flatinum 님의 [C/C++] extern "C"와 네임 맹글링 japa 님의 [링크에러 LNK2019] C++에서 C 함수 사용하기 [링크에러 LNK2019] C++에서 C 함수 사용하기 출처: https://ospace.tistory.com/187 [JaPa2] [링크에러 LNK2019] C++에서 C 함수 사용하기 출처: https://ospace.tistory.com/187 [JaPa2] [링크에러 LNK2019] C++에서 C 함수 사용하기 출처: https://ospace.tistory.com/187 [JaPa2] [링크에러 LNK2019] C++에서 C 함수 사용하기 출처: https://ospace.tistory.com/187 [JaPa2] 프로그램 소스들을 보면 자주 보게 되는 extern "C" 대충 C에서 C++ 함수를 사용하기 위해서 적어준다고만 알고 있었지만 윈도우에서 Visual studio 로만 코딩을 하다 보니 이게 그렇게 중요한가 라는 생각을 했었다. VS에서 주로 #include <iostream> 으로 C++ 헤더를 추가하고 printf 와 cout을 섞어 사용하다보니 별 필요성을 못 느꼈다. 물론 라이브러리들도 윈도우용이다보니 C++용이었던듯. 그러다가 리눅스로 작성을 해야하는 것이 생겨서 엄청난 귀차니즘을 맞이한적이 있다. extern "C" 는 C와 C++ 의 컴파일 방식 차이에 의해 생겨나는 미스 매치를 발생하지 않도록 하는데 그 목적이 있다. 이는 C++ 의 오버로딩 등의 기능 때문에 발생한다고 보면 될 듯하다. 자세한건 Flatinum 님의 [C/C++] extern "C"와 네임 맹글링 에서 확인해보자.  조사하다 보니 C에서 C++ 함수(라이브러리)를 사용할때도 사용되지만 C++에서 C 함수를 사용할 때도 써야

[CUDA] Cuda 공부 0

이미지
 CUDA 학습을 진행하며 정리하는 글 일단 CUDA를 설치하면 새 프로젝트 만들기에 CUDA Runtime 이 추가된다. CUDA 다운은 여기 서! 자신의 개발 환경을 선택하여서 다운로드 후 설치하면 된다. 참고로 개발 환경은 VS2019 (Enterprise) 간단하게 프로젝트 이름을 정하고 완료를 누르면 간단한 예제가 나온다.    a 행렬과 b행렬의 값들을 더하는 예제이다. 파일 확장자는 .cu 로 cuda Source Code 파일이다. 아래는 예제 프로그램 실행 시 화면이다.   이 확장자로 GPU가 할일을 작성하고 일반 C 파일 헤더처럼 include 하여 사용하면 된다. 일반 C 문법과 크게 차이는 없다. malloc 대신 cudaMalloc 을 사용하고 free 대신 cudaFree 를 사용한다는 정도 하지만 C++ 문법이 아닌 C 문법을 따르고 있다는게 흠이라면 흠이랄까... cu 파일의 기본헤더는 "Cuda_runtime.h" 이며  "device_launch_parameters.h" 는 자신의 blockIdx, blockDim, threadIdx 를 구할 때 필요하다던데 일단은 뭔진 모르겠지만 그렇단다..출처 : 쿠로이님 블로그 우선은 Q's Tech blog 에 있는 NVIDIA CUDA 기초 튜토리얼을 보며 공부 할 예정임.

[MFC] Windows 10 OCR 만들기 : 1.Tesseract(5.0.0) 컴파일

이미지
우선 참조한 블로그 : 아는대로 지껄이는 블로그 친한 동생이 타 기관에서 자료를 받았는데  파일이 아닌 팩스나 엑셀 파일을 캡쳐하여 이미지로 보내주어 손으로  일일이 다 쳐서 업무를  진행하였단 말을 듣고 불쌍한 마음에 'OCR 간단하자나...' 라는 생각이 들어 시작하게 되었으나...  역시 이론과 실전은 다르다고 Tesseract 컴파일 하는데만 무지 시간을 잡아먹으며 삽질의 연속 이었다.  각설하고 컴파일한거 설명해보도록 하자  우선  vs2015 이상이 필요하며 CMake 도 필요하니 미리 준비하도록 하자 개발 환경 : VS2022(Preview Ver.), Windows 10 Tesseract를 컴파일 하려면 Leptonica 를 컴파일 해야하고  Leptonica 를 컴파일 하려면 여러 lib파일들이 필요한데  이는 https://github.com/peirick/Tesseract-OCR_for_Windows 에서 다운로드 가능하다. 다운로드가 완료 되면 tesseract 프로젝트를 실행하여 컴파일 하도록 하자. 처음 냅다 컴파일 하면 무지막지한 에러들을 볼 수 있다. 하지만 폴더 내에 있는 Release 폴더에 가보면 우리가 필요로 하는 lib파일들이 생성된 것을 볼 수 있다. (Tesseract-OCR_for_Windows-master\x64\Release) 자 이제 Leptonica를 컴파일 해보자 Leptonica 는 공식 사이트나 Git Hub에 있으니 둘 중 편한 Git Hub에서 받자 https://github.com/danbloomberg/leptonica git clone https://github.com/danbloomberg/leptonica.git 다운로드 후 Leptonica 폴더 안에 build 폴더랑 lib 폴더를 생성해준다. 그리고 CMake 를 실행한 후 소스 폴더와 빌드 폴더를 각각 Leptonica 폴더와 build 폴더로 지정한다.   그리고 위에서 만들었던 lib 파일들을 생성한 lib 폴

[Python] 이미지 크기 가져오는 함수

이미지
 간만에 파이썬으로 뭘 좀 하려다 보니 생각 안나는 것 투성이다. 매트랩이랑 같은 함수인데 기억도 안나고.... 매트랩을 한다고 해도 다시 공부해야 할 것 같다;; 오늘은 기본으로 돌아가서 이미지 크기를 가져오는 방법을 알아보자 단 한줄이면 끝나지만...ㅎㅎㅎ 이미지를 읽어 왔다고 가정하면 .shape 만 해주면 끝이다. img1 = cv2.imread(dirPath+filename1 , cv2.IMREAD_GRAYSCALE) h = img1.shape height = img1.shape[ 0 ] width = img1.shape[ 1 ] 위 소스는 그레이 스케일일 경우 이미지 크기를 읽어 오는 방법이다. 그레이 스케일일 경우 1차원 밖에 없기 때문에 높이와 넓이 두가지로 이루어진 튜플을 볼 수 있다. img1 = cv2.imread(dirPath+filename1 , cv2.IMREAD_COLOR) h = img1.shape height = img1.shape[ 0 ] width = img1.shape[ 1 ] 이번엔 컬러 이미지로 읽어 왔을 경우 h를 보면 높이, 넓이, 채널 수로 구성된 튜플임을 알 수 있다.

[잡담] GPUDirect Storage and for Video

이미지
 회사에서 빠르고 많은 이미지 저장을 위해 검색을 하던 중 GPUDirect Storage 란 녀석을 발견하게 되었다. GPU와 SSD 등의 저장매체에 바로 접근하는 방법으로 기존 파일 읽어오는 방식보다  빠르게 많은 정보를 읽고 쓸 수 있는 방식이다. 하지만 아직까진 특수 환경에서만 사용가능한 녀석이다. 지원되는 그래픽 카드가 한정적이며 OS 지원도 필요한데 주로 사용하는 OS 가 윈도우다 보니 아직 직접 테스트를 해보지는 못하였다. 우선은 2021년 6월 초 기준으로 자료만 정리할까 한다. GPUDirect 기술로는 GPUDirect Storage, GPUDirect RDMA, GPUDirect for Video 3가지가 있다. GPUDirect Storage는 위에서 간단히 설명한 녀석이고 GPUDirect RDMA 는 원격으로 다른 2대의 시스템간 GPU에 있는 데이터를 주고 받는 방식이다. 그리고  GPUDirect for Video는 Grabber 와 GPU 간 데이터는 주고 받는 방식이다.  GPUDirect for Video와 Storage 두가지 방식을 이용해서 많은 데이터를 받아 저장하려 하였으나 지원하는 그래픽 카드가 아직은 너무 적어서 포기하였다.    - From GPUDirect Storage Document  Nvidia V100 과 Ampere Architecture 라는데 평소에는 들어보지도 못한 녀석들이라;; 평소 보기 힘든 Tesla나 Quadro 역시 아직까지 지원을 하지 않는단다;; 지원 OS도 리눅스 밖에 없어 아직까지는 이 기술을 사용이 제한적일 듯 하다.  자료를 찾을 때 보긴했으나 저장을 안해놓아 어디서 봤는지 기억이 안나지만 윈도우에서도 올해말안에 지원하는 기능을 추가한다고 하니 그때까지 기다려 보려 한다. 빨리 윈도우에서의 지원과 일반 게이밍 그래픽카드에서의 지원으로 게임할 때도 빠른 로딩을 사용 할 수 있기를 빌어본다.    

[Python] selenium 를 이용한 이미지 크롤링

특정 이미지를 학습 시킬 일이 있어 이미지를 모으는 방법을 찾다가 알아낸 방법으로   이미지 크롤링이란 녀석이다.   홈페이지에 찾고 싶은 검색어를 입력하고 프로그램이 알아서 이미지들을 수집하는 것이라 보면 되겠다.   우선 참고한 곳의 블로그들 : 섭섭님 블로그 mjhuh263 님 블로그    그럼 코드 부터! from selenium import webdriver from selenium.webdriver.common.keys import Keys import time import urllib.request import os def search_selenium(search_name, search_path, search_limit):     search_url = "https://www.google.co.kr/imghp?hl=ko"     driver = webdriver.Edge(executable_path='msedgedriver.exe')     driver.get(search_url)     elem = driver.find_element_by_name("q")     elem.send_keys(search_name)     elem.send_keys(Keys.RETURN)     SCROLL_PAUSE_TIME = 1     # Get scroll height     last_height = driver.execute_script("return document.body.scrollHeight")     while True:         driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")         time.sleep(SCROLL_PAUSE_TIME)         new_height = driver.execute_script("return document.body