본문 바로가기
Programmer/openCV for Android

Android openCV #3 - 반전영상 구현하기(Negative Image)

by JaehwanPark 2017. 2. 28.


Android openCV - 반전영상 구현하기(Negative Image)


아래의 예제는 링크의 소스를 베이스로 해서 진행되고 있습니다.

http://technote.tistory.com/3


실행결과 (원본, 반전영상)



1) 직접계산해서 반전영상 만드는 방법


1. 반전영상에 사용할 Image를 Bitmap 변수에 저장.

if(mBitmap != null){
img_input = new Mat();
img_output = new Mat();
Utils.bitmapToMat(mBitmap,img_input);
convertNativeLibtoNegative(img_input.getNativeObjAddr(),img_output.getNativeObjAddr());
Utils.matToBitmap(img_output,mBitmap);
mImgViewResult.setImageBitmap(mBitmap);
}


2. JNI 부분에서 아래처럼 추가 하면 됩니다.

JNIEXPORT jint JNICALL
Java_opencvtest_com_lge_opencvtest_MainActivity_convertNativeLibtoNegative(JNIEnv*, jobject, jlong addrInput, jlong addrResult) {

Mat &img_input = *(Mat *) addrInput;
Mat &img_result = *(Mat *) addrResult;

int conv = processToNegative(img_input, img_result);
int ret = (jint) conv;

return ret;
}
int processToNegative(Mat img_input, Mat &img_result)
{
cvtColor( img_input, img_result, CV_RGBA2GRAY);
Mat srcImage = img_result;

if(srcImage.empty())
LOGD("%s : empty!",__FUNCTION__);

Mat_<uchar>image(srcImage);
Mat_<uchar>destImage(srcImage.size());

for(int y = 0 ; y < image.rows ; y++){
for(int x = 0 ; x < image.cols; x++){
uchar r = image(y,x);
destImage(y,x) = 255 -r;
}
}
img_result = destImage.clone();
return(0);
}


2) <추가>LUT Table을 이용해서 반전영상 만드는 방법

int processToNegativeLUT(Mat img_input, Mat &img_result){
cvtColor(img_input,img_result,CV_RGB2GRAY);
Mat srcImage = img_result;

if(srcImage.empty()){
LOGD("%s : empty!",__FUNCTION__);
}

Mat_<uchar> lut(1,256);
for(int i = 0 ; i < 256 ; i++)
lut(i) = 256-i;

Mat destImage;
LUT(srcImage,lut,destImage);
img_result = destImage.clone();

return (0);
}


댓글