// Generate and return a boolean array from the source image. // Return 0 if a failure occurs or if the source image is undefined. JNIEXPORT jbooleanArray JNICALL Java_org_siprop_opencv_OpenCV_getSourceImage(JNIEnv* env, jobject thiz) { if (m_sourceImage == 0) { LOGE("Error source image was not set."); return 0; } CvMat stub; CvMat *mat_image = cvGetMat(m_sourceImage, &stub); int channels = CV_MAT_CN( mat_image->type ); int ipl_depth = cvCvToIplDepth(mat_image->type); WLNonFileByteStream *strm = new WLNonFileByteStream(); loadImageBytes(mat_image->data.ptr, mat_image->step, mat_image->width, mat_image->height, ipl_depth, channels, strm); int imageSize = strm->GetSize(); jbooleanArray res_array = env->NewBooleanArray(imageSize); if (res_array == 0) { LOGE("Unable to allocate a new boolean array for the source image."); return 0; } env->SetBooleanArrayRegion(res_array, 0, imageSize, (jboolean*)strm->GetByte()); strm->Close(); SAFE_DELETE(strm); return res_array; }
JNIEXPORT jbooleanArray JNICALL Java_org_siprop_opencv_OpenCV_faceDetect(JNIEnv* env, jobject thiz, jintArray photo_data1, jintArray photo_data2, jint width, jint height) { LOGV("Load desp."); int i, x, y; int* pixels; IplImage *frameImage; IplImage *backgroundImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *grayImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *differenceImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *hsvImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 3 ); IplImage *hueImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *saturationImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *valueImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *thresholdImage1 = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *thresholdImage2 = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *thresholdImage3 = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); IplImage *faceImage = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); CvMoments moment; double m_00; double m_10; double m_01; int gravityX; int gravityY; jbooleanArray res_array; int imageSize; // Load Image pixels = env->GetIntArrayElements(photo_data1, 0); frameImage = loadPixels(pixels, width, height); if(frameImage == 0) { LOGV("Error loadPixels."); return 0; } cvCvtColor( frameImage, backgroundImage, CV_BGR2GRAY ); pixels = env->GetIntArrayElements(photo_data2, 0); frameImage = loadPixels(pixels, width, height); if(frameImage == 0) { LOGV("Error loadPixels."); return 0; } cvCvtColor( frameImage, grayImage, CV_BGR2GRAY ); cvAbsDiff( grayImage, backgroundImage, differenceImage ); cvCvtColor( frameImage, hsvImage, CV_BGR2HSV ); LOGV("Load cvCvtColor."); cvSplit( hsvImage, hueImage, saturationImage, valueImage, 0 ); LOGV("Load cvSplit."); cvThreshold( hueImage, thresholdImage1, THRESH_BOTTOM, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY ); cvThreshold( hueImage, thresholdImage2, THRESH_TOP, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY_INV ); cvAnd( thresholdImage1, thresholdImage2, thresholdImage3, 0 ); LOGV("Load cvAnd."); cvAnd( differenceImage, thresholdImage3, faceImage, 0 ); cvMoments( faceImage, &moment, 0 ); m_00 = cvGetSpatialMoment( &moment, 0, 0 ); m_10 = cvGetSpatialMoment( &moment, 1, 0 ); m_01 = cvGetSpatialMoment( &moment, 0, 1 ); gravityX = m_10 / m_00; gravityY = m_01 / m_00; LOGV("Load cvMoments."); cvCircle( frameImage, cvPoint( gravityX, gravityY ), CIRCLE_RADIUS, CV_RGB( 255, 0, 0 ), LINE_THICKNESS, LINE_TYPE, 0 ); CvMat stub, *mat_image; int channels, ipl_depth; mat_image = cvGetMat( frameImage, &stub ); channels = CV_MAT_CN( mat_image->type ); ipl_depth = cvCvToIplDepth(mat_image->type); WLNonFileByteStream* m_strm = new WLNonFileByteStream(); loadImageBytes(mat_image->data.ptr, mat_image->step, mat_image->width, mat_image->height, ipl_depth, channels, m_strm); LOGV("Load loadImageBytes."); imageSize = m_strm->GetSize(); res_array = env->NewBooleanArray(imageSize); LOGV("Load NewByteArray."); if (res_array == 0) { return 0; } env->SetBooleanArrayRegion(res_array, 0, imageSize, (jboolean*)m_strm->GetByte()); LOGV("Load SetBooleanArrayRegion."); cvReleaseImage( &backgroundImage ); cvReleaseImage( &grayImage ); cvReleaseImage( &differenceImage ); cvReleaseImage( &hsvImage ); cvReleaseImage( &hueImage ); cvReleaseImage( &saturationImage ); cvReleaseImage( &valueImage ); cvReleaseImage( &thresholdImage1 ); cvReleaseImage( &thresholdImage2 ); cvReleaseImage( &thresholdImage3 ); cvReleaseImage( &faceImage ); cvReleaseImage( &frameImage ); m_strm->Close(); SAFE_DELETE(m_strm); return res_array; }
JNIEXPORT jbooleanArray JNICALL Java_org_siprop_opencv_OpenCV_findContours(JNIEnv* env, jobject thiz, jint width, jint height) { IplImage *grayImage = cvCreateImage( cvGetSize(m_sourceImage), IPL_DEPTH_8U, 1 ); // グレースケール画像用IplImage IplImage *binaryImage = cvCreateImage( cvGetSize(m_sourceImage), IPL_DEPTH_8U, 1 ); // 2値画像用IplImage IplImage *contourImage = cvCreateImage( cvGetSize(m_sourceImage), IPL_DEPTH_8U, 3 ); // 輪郭画像用IplImage // BGRからグレースケールに変換する cvCvtColor( m_sourceImage, grayImage, CV_BGR2GRAY ); // グレースケールから2値に変換する cvThreshold( grayImage, binaryImage, THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY ); // 輪郭抽出用のメモリを確保する CvMemStorage* storage = cvCreateMemStorage( 0 ); // 抽出された輪郭を保存する領域 CvSeq* find_contour = 0; // 輪郭へのポインタ // 2値画像中の輪郭を見つけ、その数を返す int find_contour_num = cvFindContours( binaryImage, // 入力画像(8ビットシングルチャンネル) storage, // 抽出された輪郭を保存する領域 &find_contour, // 一番外側の輪郭へのポインタへのポインタ sizeof( CvContour ), // シーケンスヘッダのサイズ CV_RETR_LIST, // 抽出モード CV_CHAIN_APPROX_NONE, // 推定手法 cvPoint( 0, 0 ) // オフセット ); // 物体の輪郭を赤色で描画する CvScalar red = CV_RGB( 255, 0, 0 ); cvDrawContours( m_sourceImage, // 輪郭を描画する画像 find_contour, // 最初の輪郭へのポインタ red, // 外側輪郭線の色 red, // 内側輪郭線(穴)の色 CONTOUR_MAX_LEVEL, // 描画される輪郭の最大レベル LINE_THICKNESS, // 描画される輪郭線の太さ LINE_TYPE, // 線の種類 cvPoint( 0, 0 ) // オフセット ); int imageSize; CvMat stub, *mat_image; int channels, ipl_depth; mat_image = cvGetMat( m_sourceImage, &stub ); channels = CV_MAT_CN( mat_image->type ); ipl_depth = cvCvToIplDepth(mat_image->type); LOGV("Load loadImageBytes."); WLNonFileByteStream* strm = new WLNonFileByteStream(); loadImageBytes(mat_image->data.ptr, mat_image->step, mat_image->width, mat_image->height, ipl_depth, channels, strm); imageSize = strm->GetSize(); jbooleanArray res_array = env->NewBooleanArray(imageSize); LOGV("Load NewBooleanArray."); if (res_array == 0) { return 0; } env->SetBooleanArrayRegion(res_array, 0, imageSize, (jboolean*)strm->GetByte()); LOGV("Load SetBooleanArrayRegion."); LOGV("Release sourceImage"); if (m_sourceImage) { cvReleaseImage(&m_sourceImage); m_sourceImage = 0; } LOGV("Release binaryImage"); cvReleaseImage( &binaryImage ); LOGV("Release grayImage"); cvReleaseImage( &grayImage ); LOGV("Release contourImage"); cvReleaseImage( &contourImage ); LOGV("Release storage"); cvReleaseMemStorage( &storage ); LOGV("Delete strm"); strm->Close(); SAFE_DELETE(strm); return res_array; }
CV_IMPL int cvSaveImage( const char* filename, const CvArr* arr ) { int origin = 0; GrFmtWriter* writer = 0; CvMat *temp = 0, *temp2 = 0; CV_FUNCNAME( "cvSaveImage" ); __BEGIN__; CvMat stub, *image; int channels, ipl_depth; if( !filename || strlen(filename) == 0 ) CV_ERROR( CV_StsNullPtr, "null filename" ); CV_CALL( image = cvGetMat( arr, &stub )); if( CV_IS_IMAGE( arr )) origin = ((IplImage*)arr)->origin; channels = CV_MAT_CN( image->type ); if( channels != 1 && channels != 3 && channels != 4 ) CV_ERROR( CV_BadNumChannels, "" ); writer = g_Filters.FindWriter( filename ); if( !writer ) CV_ERROR( CV_StsError, "could not find a filter for the specified extension" ); if( origin ) { CV_CALL( temp = cvCreateMat(image->rows, image->cols, image->type) ); CV_CALL( cvFlip( image, temp, 0 )); image = temp; } ipl_depth = cvCvToIplDepth(image->type); if( !writer->IsFormatSupported(ipl_depth) ) { assert( writer->IsFormatSupported(IPL_DEPTH_8U) ); CV_CALL( temp2 = cvCreateMat(image->rows, image->cols, CV_MAKETYPE(CV_8U,channels)) ); CV_CALL( cvConvertImage( image, temp2 )); image = temp2; ipl_depth = IPL_DEPTH_8U; } if( !writer->WriteImage( image->data.ptr, image->step, image->width, image->height, ipl_depth, channels )) CV_ERROR( CV_StsError, "could not save the image" ); __END__; delete writer; cvReleaseMat( &temp ); cvReleaseMat( &temp2 ); return cvGetErrStatus() >= 0; }