[안드로이드] undefined reference to `cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&)'


안드로이드에서 CMake를 사용해서 OpenCV를 사용한 JNI 함수를 만들다 보면 imwrite 부분이 컴파일이 안 되는 경우가 있습니다. 이 때에는 gradle 파일에 다음과 같이 arguments '-DANDROID_STL=gnustl_shared' 을 추가해 주면 됩니다.


android {

    // ...

    defaultConfig {

        // ...

        externalNativeBuild {

            cmake {

                arguments '-DANDROID_STL=gnustl_shared' // needed to enable imwrite                

            }

        }

    }

}


"뭐뭐 한 것 같아요"의 유해성

"뭐뭐 한 것 같아요" 라는 표현이 무분별하게 사용되면서 한국어를 좀먹고 있다. 그 유해성이 어느 정도인지 알아보기 위해 여러 명언, 명문, 명대사 등에 "뭐뭐 한 것 같아요"를 붙여 보았다.

이순신: 신에게는 아직 열 두 척의 배가 있는 것 같습니다.
갈릴레이: 그래도 지구는 도는 것 같다.
세종대왕: 백성이 하고 싶은 말이 있어도 제 뜻을 능히 펴지 못하는 것이 불쌍한 것 같다.
공자: 멀리서 친구가 찾아오니까 참 기쁜 것 같다.
기미독립선언문: 오등은 자에 아 조선은 독립국인 것 같다.
데카르트: 나는 생각하니까 존재하는 것 같다.
카이사르: 온 것 같고 본 것 같고 이긴 것 같다.
햄릿: 사느냐 죽느냐 그것이 문제인 것 같다.
소크라테스: 너 자신을 알아야 할 것 같다.
블랙 팬서: 와칸다는 영원할 것 같다.
마틴 루터 킹: 나에게는 꿈이 있는 것 같다.
마르크스: 만국의 노동자들이 단결해야 할 것 같다.
관우: 술이 식기 전에 돌아올 것 같소.
지드래곤: 나도 어디서 꿀리진 않는 것 같아.
지하철 안내 방송: 이번 역은 사당, 사당인 것 같습니다. 내리실 문은 왼쪽인 것 같습니다.
용비어천가: 뿌리 깊은 나무는 바람에도 흔들리지 않을 것 같다.
윤동주: 육첩 방은 남의 나라인 것 같다.
김소월: 나 보기가 역겨워 가실 때에는 죽어도 눈물을 안 흘릴 것 같습니다.
히딩크: 나는 아직도 배가 고픈 것 같다.

[자바] 배열 내용 출력하기 (Arrays.toString())


자바에서 배열 내용을 출력해보려고 배열 자체에서 toString()을 사용하면 배열의 내용이 아니라 배열의 주소값이 출력됩니다. 배열의 내용을 출력하려면 Arrays.toString()을 사용해야 합니다. 예제 코드는 아래와 같습니다.


double[] values = {1.0, 1.1, 1.2};

System.out.println(values.toString()); // 이렇게 하면 [D@46a49e6 같은 값이 나옵니다.

System.out.println(Arrays.toString(values)); // 이렇게 하면 [1.0, 1.1, 1.2] 이 출력됩니다.


너무 규칙적이지 말자


종이를 반으로 접었다가 펴는 작업을 반복한다고 생각해 보자. 매번 종이 끝을 정확히 맞추어서 접었다 펴면 모양은 깔끔하겠지만 접힌 부분이 쉬 닳아서 곧 찢어지게 될 것이다. 반대로 종이를 접을 때에 끝을 대충, 적당히만 맞추면 모양은 덜 예쁠지 몰라도 접히는 부분이 분산되어서 종이가 오랫동안 닳지 않을 것이다.


규칙적인 생활도 마찬가지이다. 규칙적인 생활은 좋은 것이지만 너무 칼같이 생활하다 보면 득보다 실이 많아지는 순간이 온다. 내가 규칙적으로 살아야지, 규칙이 나를 살기 시작하면 몸에든 마음에든 무리가 가기 시작한다. 그렇기에 규칙적으로 살되 가끔씩 규칙을 깸으로써 규칙에게 내가 규칙의 주인이지 규칙이 내 주인이 아니라는 것을 보여주어야 한다. 규칙적인 삶은 절대가치가 아니라 우리가 행복하게 살기 위해 사용하는 도구 중 하나일 뿐이다.



[안드로이드] error: package R does not exist


error: package R does not exist 는 매니페스트 파일에 액티비티를 적어 주지 않았을 때에 발생합니다.

아래와 같은 식으로 AndroidManifest.xml 파일 안에 액티비티를 적어 주셔야 합니다.


<application>

    ...

    <activity android:name=".MyLovelyActivity"></activity>    

</application>


[Git] fatal: The remote end hung up unexpectedly


git push를 했는데 fatal: The remote end hung up unexpectedly 이라는 에러 메시지가 뜰 때가 있습니다. 크기가 1MB 보다 큰 파일이 있을 경우 이 에러가 발생합니다. 이럴 때에는 git 설정에서 개별 파일의 최고 크기를 늘려주면 됩니다. 예를 들어 20MB 짜리 파일이 있다면 20MB = 20 * 1024 * 1024 = 20971520 bytes 이므로,


git config --global http.postBuffer 20971520


이라고 해 준 뒤에 다시 git push를 하시면 됩니다.


( 참고한 사이트: https://confluence.atlassian.com/bitbucketserverkb/git-push-fails-fatal-the-remote-end-hung-up-unexpectedly-779171796.html )

[OpenCV] 꼭짓점 (코너, corner) 추출 (cornerHarris, 파이썬)


파이썬에서 OpenCV를 사용해서 그림 파일에서 꼭짓점을 추출해보도록 하겠습니다. 코너 (corner) 추출이라고도 합니다.


import cv2

import numpy as np

import matplotlib.pyplot as plt


그림 = cv2.imread('체스판.jpg') # 결과를 보기 쉽도록 체스판 그림을 사용했습니다.

그림RGB = cv2.cvtColor(그림, cv2.COLOR_BGR2RGB)

그림흑백 = cv2.cvtColor(그림, cv2.COLOR_BGR2GRAY) # 꼭짓점 추출에는 흑백 그림이 필요합니다.

그림꼭짓점 = cv2.cvtColor(그림, cv2.COLOR_BGR2RGB) # 나중에 꼭짓점을 여기에 표시합니다.


그림흑백 = np.float32(그림흑백) # 넘파이(numpy)를 사용해서 자료형을 부동소수점으로 바꾸어주어야 합니다.

결과 = cv2.cornerHarris(그림흑백, 2, 3, 0.04) # 2, 3, 0.04는 바꿀 수 있는 인자들입니다.

결과 = cv2.dilate(결과, None, iterations=6) # 꼭짓점을 표시하기 위해 확장 (dilate) 연산을 합니다.

그림꼭짓점[결과>0.01*결과.max()]=[255, 0, 0] # 꼭짓점이 빨간색 점으로 그림에 표시됩니다.


# 이 아래 부분은 그림을 화면에 출력하기 위한 부분으로, OpenCV 알고리즘과는 상관이 없습니다.

plt.subplot(1, 2, 1) # 1행 2열에서 1번째 열

plt.imshow(그림RGB)

plt.xticks([]) # x축 좌표 숨김

plt.yticks([]) # y축 좌표 숨김


plt.subplot(1, 2, 2) # 1행 2열에서 2번째 열

plt.imshow(그림꼭짓점)

plt.xticks([]) # x축 좌표 숨김

plt.yticks([]) # y축 좌표 숨김


plt.show()


이렇게 하면 그림의 꼭짓점이 멋지게 추출되는 것을 보실 수 있습니다.



[OpenCV] 외곽선, 모서리 (엣지, edge) 추출 (Canny, 파이썬)


파이썬에서 OpenCV를 사용해서 그림 파일에서 외곽선 (모서리) 추출을 해보도록 하겠습니다. 엣지 (edge) 추출이라고도 합니다.


import cv2

import matplotlib.pyplot as plt


그림 = cv2.imread('그림파일.jpg')

그림RGB = cv2.cvtColor(그림, cv2.COLOR_BGR2RGB)

외곽선추출 = cv2.Canny(그림, 100, 200) # 100, 200은 변경 가능한 인자값입니다.


# 이 아래 부분은 그림을 화면에 출력하기 위한 부분으로, OpenCV 알고리즘과는 상관이 없습니다.

plt.subplot(1, 2, 1) # 1행 2열에서 1번째 열

plt.imshow(그림RGB)

plt.xticks([]) # x축 좌표 숨김

plt.yticks([]) # y축 좌표 숨김


plt.subplot(1, 2, 2) # 1행 2열에서 2번째 열

plt.imshow(외곽선추출, cmap='gray')

plt.xticks([]) # x축 좌표 숨김

plt.yticks([]) # y축 좌표 숨김


plt.show()


이렇게 하면 그림의 외곽선만 멋지게 추출되는 것을 보실 수 있습니다.



[OpenCV] 그림에서 RGB 채널을 각각 분리하기 (파이썬)


파이썬에서 OpenCV를 사용해서 그림의 RGB 채널을 각각 분리하려면 다음과 같이 하시면 됩니다. 제 예제 꽃 사진에는 빨간색과 초록색이 많고 파란색은 거의 없네요.


import cv2

import matplotlib.pyplot as plt


그림BGR = cv2.imread("그림파일.jpg")

그림RGB = cv2.cvtColor(그림BGR, cv2.COLOR_BGR2RGB)


# 빨간색만 뽑기

그림R = 그림RGB.copy() # 이렇게 해야 제대로 복사가 됩니다.

그림R[:,:,1] = 0 # 1: 초록색 없애기

그림R[:,:,2] = 0 # 2: 파란색 없애기


# 초록색만 뽑기

그림G = 그림RGB.copy() # 이렇게 해야 제대로 복사가 됩니다.

그림G[:,:,0] = 0 # 0: 빨간색 없애기

그림G[:,:,2] = 0 # 2: 파란색 없애기


# 파란색만 뽑기

그림B = 그림RGB.copy() # 이렇게 해야 제대로 복사가 됩니다.

그림B[:,:,0] = 0 # 0: 빨간색 없애기

그림B[:,:,1] = 0 # 1: 초록색 없애기


# 이 아래 부분은 그림을 화면에 출력하기 위한 부분으로, OpenCV 알고리즘과는 상관이 없습니다.

plt.subplot(1, 4, 1) # 1행 2열에서 1번째 열

plt.imshow(그림RGB)

plt.subplot(1, 4, 2) # 1행 2열에서 2번째 열

plt.imshow(그림R)

plt.subplot(1, 4, 3) # 1행 2열에서 2번째 열

plt.imshow(그림G)

plt.subplot(1, 4, 4) # 1행 2열에서 2번째 열

plt.imshow(그림B)

plt.show()



[OpenCV] 그림 좌우 및 상하 반전시키기 (flip, 파이썬)


파이썬에서 OpenCV를 사용해서 그림의 좌우나 상하를 바꾸려면, 즉 거울 상으로 만들려면 다음과 같이 하시면 됩니다.


import cv2

import matplotlib.pyplot as plt


그림BGR = cv2.imread("그림파일.jpg")

그림RGB = cv2.cvtColor(그림BGR, cv2.COLOR_BGR2RGB)

그림좌우반전 = cv2.flip(그림RGB, 1) # 1은 좌우 반전, 0은 상하 반전입니다.


# 이 아래 부분은 그림을 화면에 출력하기 위한 부분으로, OpenCV 알고리즘과는 상관이 없습니다.

plt.subplot(1, 2, 1) # 1행 2열에서 1번째 열

plt.imshow(그림RGB)


plt.subplot(1, 2, 2) # 1행 2열에서 2번째 열

plt.imshow(그림좌우반전)


plt.show()



+ Recent posts