|
|
|
@@ -32,6 +32,18 @@ static void throwJavaException(JNIEnv *env, const std::exception *e, const char
|
|
|
|
|
CV_UNUSED(method); // avoid "unused" warning
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// jint could be int or int32_t so casting jint* to int* in general wouldn't work
|
|
|
|
|
static std::vector<int> convertJintArrayToVector(JNIEnv* env, jintArray in) {
|
|
|
|
|
std::vector<int> out;
|
|
|
|
|
int len = env->GetArrayLength(in);
|
|
|
|
|
jint* inArray = env->GetIntArrayElements(in, 0);
|
|
|
|
|
for ( int i = 0; i < len; i++ ) {
|
|
|
|
|
out.push_back(inArray[i]);
|
|
|
|
|
}
|
|
|
|
|
env->ReleaseIntArrayElements(in, inArray, 0);
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -100,6 +112,30 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__III
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat::Mat(int[] sizes, int type)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__I_3II
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__I_3II
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1Mat__I_3II()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
std::vector<int> sizes = convertJintArrayToVector(env, sizesArray);
|
|
|
|
|
return (jlong) new Mat( ndims, sizes.data(), type );
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
@@ -182,6 +218,33 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__DDIDDDD
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat::Mat(int[] sizes, int type, Scalar s)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__I_3IIDDDD
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type, jdouble s_val0, jdouble s_val1, jdouble s_val2, jdouble s_val3);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__I_3IIDDDD
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type, jdouble s_val0, jdouble s_val1, jdouble s_val2, jdouble s_val3)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1Mat__I_3IIDDDD()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
std::vector<int> sizes = convertJintArrayToVector(env, sizesArray);
|
|
|
|
|
Scalar s(s_val0, s_val1, s_val2, s_val3);
|
|
|
|
|
return (jlong) new Mat( ndims, sizes.data(), type, s );
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat::Mat(Mat m, Range rowRange, Range colRange = Range::all())
|
|
|
|
|
//
|
|
|
|
@@ -207,6 +270,59 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__JIIII
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jint getObjectIntField(JNIEnv* env, jobject obj, const char * fieldName);
|
|
|
|
|
|
|
|
|
|
jint getObjectIntField(JNIEnv* env, jobject obj, const char * fieldName) {
|
|
|
|
|
jfieldID fid; /* store the field ID */
|
|
|
|
|
|
|
|
|
|
/* Get a reference to obj's class */
|
|
|
|
|
jclass cls = env->GetObjectClass(obj);
|
|
|
|
|
|
|
|
|
|
/* Look for the instance field s in cls */
|
|
|
|
|
fid = env->GetFieldID(cls, fieldName, "I");
|
|
|
|
|
if (fid == NULL)
|
|
|
|
|
{
|
|
|
|
|
return 0; /* failed to find the field */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Read the instance field s */
|
|
|
|
|
return env->GetIntField(obj, fid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define RANGE_START_FIELD "start"
|
|
|
|
|
#define RANGE_END_FIELD "end"
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat::Mat(Mat m, Range[] ranges)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__J_3Lorg_opencv_core_Range_2
|
|
|
|
|
(JNIEnv* env, jclass, jlong m_nativeObj, jobjectArray rangesArray);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__J_3Lorg_opencv_core_Range_2
|
|
|
|
|
(JNIEnv* env, jclass, jlong m_nativeObj, jobjectArray rangesArray)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1Mat__J_3Lorg_opencv_core_Range_2()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
std::vector<Range> ranges;
|
|
|
|
|
int rangeCount = env->GetArrayLength(rangesArray);
|
|
|
|
|
for (int i = 0; i < rangeCount; i++) {
|
|
|
|
|
jobject range = env->GetObjectArrayElement(rangesArray, i);
|
|
|
|
|
jint start = getObjectIntField(env, range, RANGE_START_FIELD);
|
|
|
|
|
jint end = getObjectIntField(env, range, RANGE_END_FIELD);
|
|
|
|
|
ranges.push_back(Range(start, end));
|
|
|
|
|
}
|
|
|
|
|
return (jlong) new Mat( (*(Mat*)m_nativeObj), ranges );
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__JII
|
|
|
|
|
(JNIEnv* env, jclass, jlong m_nativeObj, jint rowRange_start, jint rowRange_end);
|
|
|
|
@@ -718,6 +834,56 @@ JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1create__JDDI
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// void Mat::create(int[] sizes, int type)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1create__JI_3II
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint ndims, jintArray sizesArray, jint type);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1create__JI_3II
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint ndims, jintArray sizesArray, jint type)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1create__JI_3II()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
Mat* me = (Mat*) self;
|
|
|
|
|
std::vector<int> sizes = convertJintArrayToVector(env, sizesArray);
|
|
|
|
|
me->create( ndims, sizes.data(), type );
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat Mat::copySize(Mat m)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1copySize
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jlong m_nativeObj);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1copySize
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jlong m_nativeObj)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1copySize()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
Mat* me = (Mat*) self;
|
|
|
|
|
Mat& m = *((Mat*)m_nativeObj);
|
|
|
|
|
me->copySize( m );
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat Mat::cross(Mat m)
|
|
|
|
|
//
|
|
|
|
@@ -1234,6 +1400,33 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1ones__DDI
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// static Mat Mat::ones(int[] sizes, int type)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1ones__I_3II
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1ones__I_3II
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1ones__I_3II()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
std::vector<int> sizes = convertJintArrayToVector(env, sizesArray);
|
|
|
|
|
Mat _retval_ = Mat::ones( ndims, sizes.data(), type );
|
|
|
|
|
return (jlong) new Mat(_retval_);
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// void Mat::push_back(Mat m)
|
|
|
|
|
//
|
|
|
|
@@ -1344,8 +1537,8 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1reshape_11
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
Mat* me = (Mat*) self; //TODO: check for NULL
|
|
|
|
|
int* newsz = (int*)env->GetPrimitiveArrayCritical(newshape, 0);
|
|
|
|
|
Mat _retval_ = me->reshape( cn, newndims, newsz );
|
|
|
|
|
std::vector<int> newsz = convertJintArrayToVector(env, newshape);
|
|
|
|
|
Mat _retval_ = me->reshape( cn, newndims, newsz.data() );
|
|
|
|
|
return (jlong) new Mat(_retval_);
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
@@ -1649,6 +1842,39 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1submat_1rr
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mat Mat::operator()(Range[] ranges)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1submat_1ranges
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jobjectArray rangesArray);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1submat_1ranges
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jobjectArray rangesArray)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1submat_1ranges()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
Mat* me = (Mat*) self;
|
|
|
|
|
std::vector<Range> ranges;
|
|
|
|
|
int rangeCount = env->GetArrayLength(rangesArray);
|
|
|
|
|
for (int i = 0; i < rangeCount; i++) {
|
|
|
|
|
jobject range = env->GetObjectArrayElement(rangesArray, i);
|
|
|
|
|
jint start = getObjectIntField(env, range, RANGE_START_FIELD);
|
|
|
|
|
jint end = getObjectIntField(env, range, RANGE_END_FIELD);
|
|
|
|
|
ranges.push_back(Range(start, end));
|
|
|
|
|
}
|
|
|
|
|
Mat _retval_ = me->operator()( ranges );
|
|
|
|
|
return (jlong) new Mat(_retval_);
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
@@ -1811,6 +2037,33 @@ JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1zeros__DDI
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// static Mat Mat::zeros(int[] sizes, int type)
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1zeros__I_3II
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1zeros__I_3II
|
|
|
|
|
(JNIEnv* env, jclass, jint ndims, jintArray sizesArray, jint type)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::n_1zeros__I_3II()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
std::vector<int> sizes = convertJintArrayToVector(env, sizesArray);
|
|
|
|
|
Mat _retval_ = Mat::zeros( ndims, sizes.data(), type );
|
|
|
|
|
return (jlong) new Mat(_retval_);
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// native support for java finalize()
|
|
|
|
|
// static void Mat::n_delete( __int64 self )
|
|
|
|
@@ -1880,6 +2133,50 @@ template<typename T> static int mat_put(cv::Mat* m, int row, int col, int count,
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// returns true if final index was reached
|
|
|
|
|
static bool updateIdx(cv::Mat* m, std::vector<int>& idx, int inc) {
|
|
|
|
|
for (int i=m->dims-1; i>=0; i--) {
|
|
|
|
|
if (inc == 0) return false;
|
|
|
|
|
idx[i] = (idx[i] + 1) % m->size[i];
|
|
|
|
|
inc--;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T> static int mat_put_idx(cv::Mat* m, std::vector<int>& idx, int count, int offset, char* buff)
|
|
|
|
|
{
|
|
|
|
|
if(! m) return 0;
|
|
|
|
|
if(! buff) return 0;
|
|
|
|
|
|
|
|
|
|
count *= sizeof(T);
|
|
|
|
|
int rest = (int)m->elemSize();
|
|
|
|
|
for (int i = 0; i < m->dims; i++) {
|
|
|
|
|
rest *= (m->size[i] - idx[i]);
|
|
|
|
|
}
|
|
|
|
|
if(count>rest) count = rest;
|
|
|
|
|
int res = count;
|
|
|
|
|
|
|
|
|
|
if( m->isContinuous() )
|
|
|
|
|
{
|
|
|
|
|
memcpy(m->ptr(idx.data()), buff + offset, count);
|
|
|
|
|
} else {
|
|
|
|
|
// dim by dim
|
|
|
|
|
int num = (m->size[m->dims-1] - idx[m->dims-1]) * (int)m->elemSize(); // 1st partial row
|
|
|
|
|
if(count<num) num = count;
|
|
|
|
|
uchar* data = m->ptr(idx.data());
|
|
|
|
|
while(count>0){
|
|
|
|
|
memcpy(data, buff + offset, num);
|
|
|
|
|
updateIdx(m, idx, num / (int)m->elemSize());
|
|
|
|
|
count -= num;
|
|
|
|
|
buff += num;
|
|
|
|
|
num = m->size[m->dims-1] * (int)m->elemSize();
|
|
|
|
|
if(count<num) num = count;
|
|
|
|
|
data = m->ptr(idx.data());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class ARRAY> static jint java_mat_put(JNIEnv* env, jlong self, jint row, jint col, jint count, jint offset, ARRAY vals)
|
|
|
|
|
{
|
|
|
|
|
static const char *method_name = JavaOpenCVTrait<ARRAY>::put;
|
|
|
|
@@ -1903,6 +2200,31 @@ template<class ARRAY> static jint java_mat_put(JNIEnv* env, jlong self, jint row
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class ARRAY> static jint java_mat_put_idx(JNIEnv* env, jlong self, jintArray idxArray, jint count, jint offset, ARRAY vals)
|
|
|
|
|
{
|
|
|
|
|
static const char *method_name = JavaOpenCVTrait<ARRAY>::put;
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
cv::Mat* me = (cv::Mat*) self;
|
|
|
|
|
if(! self) return 0; // no native object behind
|
|
|
|
|
if(me->depth() != JavaOpenCVTrait<ARRAY>::cvtype_1 && me->depth() != JavaOpenCVTrait<ARRAY>::cvtype_2) return 0; // incompatible type
|
|
|
|
|
std::vector<int> idx = convertJintArrayToVector(env, idxArray);
|
|
|
|
|
for (int i = 0; i < me->dims ; i++ ) {
|
|
|
|
|
if (me->size[i]<=idx[i]) return 0;
|
|
|
|
|
}
|
|
|
|
|
char* values = (char*)env->GetPrimitiveArrayCritical(vals, 0);
|
|
|
|
|
int res = mat_put_idx<typename JavaOpenCVTrait<ARRAY>::value_type>(me, idx, count, offset, values);
|
|
|
|
|
env->ReleasePrimitiveArrayCritical(vals, values, JNI_ABORT);
|
|
|
|
|
return res;
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutB
|
|
|
|
@@ -1914,6 +2236,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutB
|
|
|
|
|
return java_mat_put(env, self, row, col, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutBIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jbyteArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutBIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jbyteArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_put_idx(env, self, idxArray, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutBwOffset
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jint offset, jbyteArray vals);
|
|
|
|
|
|
|
|
|
@@ -1923,6 +2254,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutBwOffset
|
|
|
|
|
return java_mat_put(env, self, row, col, count, offset, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutBwIdxOffset
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jint offset, jbyteArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutBwIdxOffset
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jint offset, jbyteArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_put_idx(env, self, idxArray, count, offset, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutS
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jshortArray vals);
|
|
|
|
|
|
|
|
|
@@ -1932,6 +2272,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutS
|
|
|
|
|
return java_mat_put(env, self, row, col, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutSIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jshortArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutSIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jshortArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_put_idx(env, self, idxArray, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutI
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jintArray vals);
|
|
|
|
|
|
|
|
|
@@ -1941,6 +2290,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutI
|
|
|
|
|
return java_mat_put(env, self, row, col, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutIIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jintArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutIIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jintArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_put_idx(env, self, idxArray, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutF
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jfloatArray vals);
|
|
|
|
|
|
|
|
|
@@ -1950,6 +2308,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutF
|
|
|
|
|
return java_mat_put(env, self, row, col, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutFIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jfloatArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutFIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jfloatArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_put_idx(env, self, idxArray, count, 0, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// unlike other nPut()-s this one (with double[]) should convert input values to correct type
|
|
|
|
|
#define PUT_ITEM(T, R, C) { T*dst = (T*)me->ptr(R, C); for(int ch=0; ch<me->channels() && count>0; count--,ch++,src++,dst++) *dst = cv::saturate_cast<T>(*src); }
|
|
|
|
|
|
|
|
|
@@ -2010,6 +2377,56 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutD
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// unlike other nPut()-s this one (with double[]) should convert input values to correct type
|
|
|
|
|
#define PUT_ITEM_IDX(T, I) { T*dst = (T*)me->ptr(I); for(int ch=0; ch<me->channels() && count>0; count--,ch++,src++,dst++) *dst = cv::saturate_cast<T>(*src); }
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutDIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jdoubleArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nPutDIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jdoubleArray vals)
|
|
|
|
|
{
|
|
|
|
|
static const char* method_name = JavaOpenCVTrait<jdoubleArray>::put;
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
cv::Mat* me = (cv::Mat*) self;
|
|
|
|
|
if(!me || !me->data) return 0; // no native object behind
|
|
|
|
|
std::vector<int> idx = convertJintArrayToVector(env, idxArray);
|
|
|
|
|
for (int i=0; i<me->dims; i++) {
|
|
|
|
|
if (me->size[i]<=idx[i]) return 0; // indexes out of range
|
|
|
|
|
}
|
|
|
|
|
int rest = me->channels();
|
|
|
|
|
for (int i=0; i<me->dims; i++) {
|
|
|
|
|
rest *= (me->size[i] - idx[i]);
|
|
|
|
|
}
|
|
|
|
|
if(count>rest) count = rest;
|
|
|
|
|
int res = count;
|
|
|
|
|
double* values = (double*)env->GetPrimitiveArrayCritical(vals, 0);
|
|
|
|
|
double* src = values;
|
|
|
|
|
bool reachedFinalIndex = false;
|
|
|
|
|
for(; !reachedFinalIndex && count>0; reachedFinalIndex = updateIdx(me, idx, 1))
|
|
|
|
|
{
|
|
|
|
|
switch(me->depth()) {
|
|
|
|
|
case CV_8U: PUT_ITEM_IDX(uchar, idx.data()); break;
|
|
|
|
|
case CV_8S: PUT_ITEM_IDX(schar, idx.data()); break;
|
|
|
|
|
case CV_16U: PUT_ITEM_IDX(ushort, idx.data()); break;
|
|
|
|
|
case CV_16S: PUT_ITEM_IDX(short, idx.data()); break;
|
|
|
|
|
case CV_32S: PUT_ITEM_IDX(int, idx.data()); break;
|
|
|
|
|
case CV_32F: PUT_ITEM_IDX(float, idx.data()); break;
|
|
|
|
|
case CV_64F: PUT_ITEM_IDX(double, idx.data()); break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
env->ReleasePrimitiveArrayCritical(vals, values, 0);
|
|
|
|
|
return res;
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // extern "C"
|
|
|
|
|
|
|
|
|
|
template<typename T> static int mat_get(cv::Mat* m, int row, int col, int count, char* buff)
|
|
|
|
@@ -2042,6 +2459,40 @@ template<typename T> static int mat_get(cv::Mat* m, int row, int col, int count,
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T> static int mat_get_idx(cv::Mat* m, std::vector<int>& idx, int count, char* buff)
|
|
|
|
|
{
|
|
|
|
|
if(! m) return 0;
|
|
|
|
|
if(! buff) return 0;
|
|
|
|
|
|
|
|
|
|
count *= sizeof(T);
|
|
|
|
|
int rest = (int)m->elemSize();
|
|
|
|
|
for (int i = 0; i < m->dims; i++) {
|
|
|
|
|
rest *= (m->size[i] - idx[i]);
|
|
|
|
|
}
|
|
|
|
|
if(count>rest) count = rest;
|
|
|
|
|
int res = count;
|
|
|
|
|
|
|
|
|
|
if( m->isContinuous() )
|
|
|
|
|
{
|
|
|
|
|
memcpy(buff, m->ptr(idx.data()), count);
|
|
|
|
|
} else {
|
|
|
|
|
// dim by dim
|
|
|
|
|
int num = (m->size[m->dims-1] - idx[m->dims-1]) * (int)m->elemSize(); // 1st partial row
|
|
|
|
|
if(count<num) num = count;
|
|
|
|
|
uchar* data = m->ptr(idx.data());
|
|
|
|
|
while(count>0){
|
|
|
|
|
memcpy(buff, data, num);
|
|
|
|
|
updateIdx(m, idx, num / (int)m->elemSize());
|
|
|
|
|
count -= num;
|
|
|
|
|
buff += num;
|
|
|
|
|
num = m->size[m->dims-1] * (int)m->elemSize();
|
|
|
|
|
if(count<num) num = count;
|
|
|
|
|
data = m->ptr(idx.data());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class ARRAY> static jint java_mat_get(JNIEnv* env, jlong self, jint row, jint col, jint count, ARRAY vals) {
|
|
|
|
|
static const char *method_name = JavaOpenCVTrait<ARRAY>::get;
|
|
|
|
|
try {
|
|
|
|
@@ -2064,6 +2515,31 @@ template<class ARRAY> static jint java_mat_get(JNIEnv* env, jlong self, jint row
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class ARRAY> static jint java_mat_get_idx(JNIEnv* env, jlong self, jintArray idxArray, jint count, ARRAY vals) {
|
|
|
|
|
static const char *method_name = JavaOpenCVTrait<ARRAY>::get;
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
cv::Mat* me = (cv::Mat*) self;
|
|
|
|
|
if(! self) return 0; // no native object behind
|
|
|
|
|
if(me->depth() != JavaOpenCVTrait<ARRAY>::cvtype_1 && me->depth() != JavaOpenCVTrait<ARRAY>::cvtype_2) return 0; // incompatible type
|
|
|
|
|
std::vector<int> idx = convertJintArrayToVector(env, idxArray);
|
|
|
|
|
for (int i = 0; i < me->dims ; i++ ) {
|
|
|
|
|
if (me->size[i]<=idx[i]) return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char* values = (char*)env->GetPrimitiveArrayCritical(vals, 0);
|
|
|
|
|
int res = mat_get_idx<typename JavaOpenCVTrait<ARRAY>::value_type>(me, idx, count, values);
|
|
|
|
|
env->ReleasePrimitiveArrayCritical(vals, values, 0);
|
|
|
|
|
return res;
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetB
|
|
|
|
@@ -2075,6 +2551,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetB
|
|
|
|
|
return java_mat_get(env, self, row, col, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetBIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jbyteArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetBIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jbyteArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_get_idx(env, self, idxArray, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetS
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jshortArray vals);
|
|
|
|
|
|
|
|
|
@@ -2084,6 +2569,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetS
|
|
|
|
|
return java_mat_get(env, self, row, col, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetSIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jshortArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetSIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jshortArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_get_idx(env, self, idxArray, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetI
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jintArray vals);
|
|
|
|
|
|
|
|
|
@@ -2093,6 +2587,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetI
|
|
|
|
|
return java_mat_get(env, self, row, col, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetIIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jintArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetIIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jintArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_get_idx(env, self, idxArray, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetF
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jfloatArray vals);
|
|
|
|
|
|
|
|
|
@@ -2102,6 +2605,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetF
|
|
|
|
|
return java_mat_get(env, self, row, col, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetFIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jfloatArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetFIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jfloatArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_get_idx(env, self, idxArray, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetD
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col, jint count, jdoubleArray vals);
|
|
|
|
|
|
|
|
|
@@ -2111,6 +2623,15 @@ JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetD
|
|
|
|
|
return java_mat_get(env, self, row, col, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetDIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jdoubleArray vals);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_opencv_core_Mat_nGetDIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray, jint count, jdoubleArray vals)
|
|
|
|
|
{
|
|
|
|
|
return java_mat_get_idx(env, self, idxArray, count, vals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Mat_nGet
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jint row, jint col);
|
|
|
|
|
|
|
|
|
@@ -2149,6 +2670,47 @@ JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Mat_nGet
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Mat_nGetIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray);
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jdoubleArray JNICALL Java_org_opencv_core_Mat_nGetIdx
|
|
|
|
|
(JNIEnv* env, jclass, jlong self, jintArray idxArray)
|
|
|
|
|
{
|
|
|
|
|
static const char method_name[] = "Mat::nGetIdx()";
|
|
|
|
|
try {
|
|
|
|
|
LOGD("%s", method_name);
|
|
|
|
|
cv::Mat* me = (cv::Mat*) self;
|
|
|
|
|
if(! self) return 0; // no native object behind
|
|
|
|
|
std::vector<int> idx = convertJintArrayToVector(env, idxArray);
|
|
|
|
|
for (int i=0; i<me->dims; i++) {
|
|
|
|
|
if (me->size[i]<=idx[i]) return 0; // indexes out of range
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jdoubleArray res = env->NewDoubleArray(me->channels());
|
|
|
|
|
if(res){
|
|
|
|
|
jdouble buff[CV_CN_MAX];//me->channels()
|
|
|
|
|
int i;
|
|
|
|
|
switch(me->depth()){
|
|
|
|
|
case CV_8U: for(i=0; i<me->channels(); i++) buff[i] = *((unsigned char*) me->ptr(idx.data()) + i); break;
|
|
|
|
|
case CV_8S: for(i=0; i<me->channels(); i++) buff[i] = *((signed char*) me->ptr(idx.data()) + i); break;
|
|
|
|
|
case CV_16U: for(i=0; i<me->channels(); i++) buff[i] = *((unsigned short*)me->ptr(idx.data()) + i); break;
|
|
|
|
|
case CV_16S: for(i=0; i<me->channels(); i++) buff[i] = *((signed short*) me->ptr(idx.data()) + i); break;
|
|
|
|
|
case CV_32S: for(i=0; i<me->channels(); i++) buff[i] = *((int*) me->ptr(idx.data()) + i); break;
|
|
|
|
|
case CV_32F: for(i=0; i<me->channels(); i++) buff[i] = *((float*) me->ptr(idx.data()) + i); break;
|
|
|
|
|
case CV_64F: for(i=0; i<me->channels(); i++) buff[i] = *((double*) me->ptr(idx.data()) + i); break;
|
|
|
|
|
}
|
|
|
|
|
env->SetDoubleArrayRegion(res, 0, me->channels(), buff);
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
} catch(const std::exception &e) {
|
|
|
|
|
throwJavaException(env, &e, method_name);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
throwJavaException(env, 0, method_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jstring JNICALL Java_org_opencv_core_Mat_nDump
|
|
|
|
|
(JNIEnv *env, jclass, jlong self);
|
|
|
|
|
|
|
|
|
|