Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Работа с камерой и NDK - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Убрать уведомление из статус-бара http://www.cyberforum.ru/android-dev/thread1542022.html
Чтобы убрать уведомление из статус-бара используют: notificationmanager.cancel(int id), но как узнать id уведомления?
Программирование Android Как из кода узнать размер шрифта TextView Вопрос в заголовке http://www.cyberforum.ru/android-dev/thread1542007.html
Подмена потока с микрофона Программирование Android
Нужно подменипть поток с микрофона, чтобы отправить его при разговоре. Типа диалер, который вместо звука с микрофона будет пускать другой аудиопоток. Каким образом это можно реализовать?
CGM google-services.json Программирование Android
Здравствуйте. Кто знает, для чего в GCM нужен google-services.json?
Программирование Android Игра без движка http://www.cyberforum.ru/android-dev/thread1541778.html
Жанр: головоломка. Суть игры заключается в передвижении геометрических фигур (с минимальной графикой, то есть по щёлчку на кнопку происходит передвежение нескольких фигур в заданных направлениях). ...
Программирование Android Выполнение внешнего Java файла или обновление приложения В общем, вопрос таков, мне надо автоматически обновлять приложение без плеймаркета и обновления всего приложения в целом... Есть основной класс,он выполняет почти все действия, но т.к. мне надо... подробнее

Показать сообщение отдельно
kompozitor12345
4 / 4 / 1
Регистрация: 12.12.2010
Сообщений: 17

Работа с камерой и NDK - Программирование Android

01.10.2015, 12:33. Просмотров 404. Ответов 1
Метки (Все метки)

Итак есть приложение показывает изображение с камеры а поверх него выводить гистограмму. Отдельно без JNI камера работает, но при подключении JNI вылазит ошибка при запуске на устройстве. Работа с гистограммой происходит в нативном коде. Вот код. Не знаю уже что и предпринять, перепробовал уже кажется все) Лог выдает вот что, но не всегда) Может есть какие то соображения. АPI 19 4.4.2 на устройстве тоже 4.4.2.

Код MainActivity

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package
 com.example.plus.cameraview;
 
class HistogramView extends View {
    int[] mBlueHistogram;
    int[] mGreenHistogram;
    int[] mRedHistogram;
 
    Paint mPaintBlue;
    Paint mPaintGreen;
    Paint mPaintRed;
 
    public long histogram_cpp_;
    public native void decodeYUV420SP( long cppobj, byte[] yuv, int width, int height);
    private native void calculateHistogram(long cppobj, int[] r_histogram, int[] g_histogram, int[] b_histogram);
    private native void doneCppSide( long cppobj );
    private native long initCppSide();
    private native int getMaxHeight(long cppobj);
    private native int getHeight(long cppobj);
    private native int getWidth(long cppobj);
 
    public HistogramView(Context context) {
        super(context);
        histogram_cpp_ = initCppSide();
 
        mPaintRed = new Paint();
        mPaintRed.setStyle(Paint.Style.FILL);
        mPaintRed.setColor(Color.RED);
        mPaintRed.setAntiAlias(true);
 
        mPaintGreen = new Paint();
        mPaintGreen.setStyle(Paint.Style.FILL);
        mPaintGreen.setColor(Color.GREEN);
        mPaintGreen.setAntiAlias(true);
 
        mPaintBlue = new Paint();
        mPaintBlue.setStyle(Paint.Style.FILL);
        mPaintBlue.setColor(Color.BLUE);
        mPaintBlue.setAntiAlias(true);
 
        mRedHistogram = new int[256];
        mGreenHistogram = new int[256];
        mBlueHistogram = new int[256];
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        int canvasWidth = canvas.getWidth();
        int canvasHeight = canvas.getHeight();
        int newImageWidth = canvasWidth;
        int marginWidth = (canvasWidth - newImageWidth)/2;
 
        calculateHistogram(histogram_cpp_, mRedHistogram, mGreenHistogram, mBlueHistogram);
 
        // Draw intensity histogram
        final float barWidth = ((float)newImageWidth) / 256;
        final float norm = getMaxHeight(histogram_cpp_)/(canvasHeight/2);
        float prev_blue_h = canvasHeight;
        float prev_red_h = canvasHeight;
        float prev_green_h = canvasHeight;
        float prev_x = marginWidth;
        for (int bin = 0; bin < 256; bin++)
        {
            final float new_blue_h = canvasHeight - mBlueHistogram[bin]/norm;
            canvas.drawLine(prev_x, prev_blue_h, prev_x+barWidth, new_blue_h, mPaintBlue);
 
            final float new_red_h = canvasHeight - mRedHistogram[bin]/norm;
            canvas.drawLine(prev_x, prev_red_h, prev_x+barWidth, new_red_h, mPaintRed);
 
            final float new_green_h = canvasHeight - mGreenHistogram[bin]/norm;
            canvas.drawLine(prev_x, prev_green_h, prev_x+barWidth, new_green_h, mPaintGreen);
 
            prev_x += barWidth;
            prev_blue_h = new_blue_h;
            prev_red_h = new_red_h;
            prev_green_h = new_green_h;
        } // bin
 
        super.onDraw(canvas);
    } // end onDraw method    
}
 
//----------------------------------------------------------------------
 
class Preview extends SurfaceView implements SurfaceHolder.Callback {
    Camera camera_;
    boolean finished_;
    SurfaceHolder holder_;
    HistogramView histogram_view_;
 
    Preview(Context context, HistogramView hv ) {
        super(context);
        histogram_view_ = hv;
 
        finished_ = false;
 
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        holder_ = getHolder();
        holder_.addCallback(this);
        holder_.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Now that the size is known, set up the camera parameters and begin
        // the preview.
        Camera.Parameters parameters = camera_.getParameters();
        parameters.setPreviewSize(320, 240);
        parameters.setPreviewFrameRate(25);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        camera_.setParameters(parameters);
        camera_.startPreview();
    }
 
    public void surfaceCreated(SurfaceHolder holder) {
 
        camera_ = Camera.open();
        try {
            camera_.setPreviewDisplay(holder);
            camera_.setPreviewCallback(new PreviewCallback() {
                public void onPreviewFrame(byte[] data, Camera camera)
                {
                    if ( finished_ )
                        return;
 
                    // Initialize the draw-on-top companion
                    Camera.Parameters params = camera.getParameters();
                    histogram_view_.decodeYUV420SP( histogram_view_.histogram_cpp_, data, params.getPreviewSize().width, params.getPreviewSize().height );
                    histogram_view_.invalidate();
                }
            });
 
        }
        catch (IOException exception) {
            camera_.release();
            camera_ = null;
        }
    }
 
    public void surfaceDestroyed(SurfaceHolder holder) {
        // Surface will be destroyed when we return, so stop the preview.
        // Because the CameraDevice object is not a shared resource, it's very
        // important to release it when the activity is paused.
        finished_ = true;
        camera_.setPreviewCallback(null);
        camera_.stopPreview();
        camera_.release();
        camera_ = null;
    }
}
 
//----------------------------------------------------------------------
 
[XML]public class MainActivity extends Activity {
   static {
        System.loadLibrary("camera_view");
    }
    private Preview preview_;
    private HistogramView histogram_view_;
 
   // public native String get_text_from_cpp();
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //setTitle( get_text_from_cpp() );
 
        histogram_view_ = new HistogramView( this );
        preview_ = new Preview( this, histogram_view_ );
        setContentView( preview_ );
        addContentView(histogram_view_, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) );
    }
} [/XML]
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
activity_main.xml
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        />
 
 
</LinearLayout>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
app.build gradle
 
apply plugin: 'com.android.model.application'
model {
    android {
        compileSdkVersion = 19
        buildToolsVersion = "19.1"
 
        defaultConfig.with {
            applicationId = "com.example.plus.cameraview"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 19
        }
    }
    /*
     * native build settings
     */
    android.ndk {
        moduleName = "camera_view"
 
        //cppFlags += "-DANDROID_NDK"
        //cppFlags += "-fno-exceptions"
        ldLibs = ["android", "log"]
        stl = "stlport_static"
 
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.txt')
        }
    }
    android.productFlavors {
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // [url]https://developer.android.com/ndk/guides/abis.html#sa[/url]
        create("arm") {
            ndk.abiFilters += "armeabi"
        }
        create("arm7") {
            ndk.abiFilters += "armeabi-v7a"
        }
        create("arm8") {
            ndk.abiFilters += "arm64-v8a"
        }
        create("x86") {
            ndk.abiFilters += "x86"
        }
        create("x86-64") {
            ndk.abiFilters += "x86_64"
        }
        create("mips") {
            ndk.abiFilters += "mips"
        }
        create("mips-64") {
            ndk.abiFilters += "mips64"
        }
        // To include all cpu architectures, leaves abiFilters empty
        create("all")
    }
}
Папка jni в папке main
файл camera_view

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
// Created by Олег on 30.09.2015.
//
#include "histogram.h"
#include <string.h>
#include <jni.h>
 
 
 
/* JNIEXPORT jstring JNICALL Java_com_example_plus_cameraview_MainActivity_get_text_from_cpp
        (JNIEnv *env, jobject) {
    return env->NewStringUTF("hello from C++");
}
*/
JNIEXPORT jlong JNICALL Java_com_example_plus_cameraview_HistogramView_initCppSide
        (JNIEnv *, jobject) {
    histogram * h = new histogram;
    return reinterpret_cast<long>(h);
}
 
JNIEXPORT void JNICALL Java_com_example_plus_cameraview_HistogramView_doneCppSide
        (JNIEnv *, jobject, jlong cppobj) {
    histogram *h = reinterpret_cast<histogram *>(cppobj);
    delete h;
}
 
JNIEXPORT void JNICALL Java_com_example_plus_cameraview_HistogramView_calculateHistogram
        (JNIEnv *env, jobject, jlong cppobj, jintArray jr, jintArray jg, jintArray jb) {
    int *r = static_cast<int *>(env->GetPrimitiveArrayCritical(jr, 0));
    int *g = static_cast<int *>(env->GetPrimitiveArrayCritical(jg, 0));
    int *b = static_cast<int *>(env->GetPrimitiveArrayCritical(jb, 0));
 
    histogram *h = reinterpret_cast<histogram * >(cppobj);
    h->get_histograms(r, g, b);
 
    env->ReleasePrimitiveArrayCritical(jb, r, 0);
    env->ReleasePrimitiveArrayCritical(jg, g, 0);
    env->ReleasePrimitiveArrayCritical(jr, b, 0);
}
 
JNIEXPORT void JNICALL Java_com_example_plus_cameraview_HistogramView_decodeYUV420SP
        (JNIEnv *env, jobject, jlong cppobj, jbyteArray jyuv420sp, jint width, jint height) {
    unsigned char *yuv420sp = static_cast<unsigned char *>(
            env->GetPrimitiveArrayCritical(jyuv420sp, 0));
 
    histogram *h = reinterpret_cast<histogram *>(cppobj);
    h->init_from_YUV420SP(yuv420sp, width, height);
 
    env->ReleasePrimitiveArrayCritical(jyuv420sp, yuv420sp, 0);
}
 
JNIEXPORT jint JNICALL Java_com_example_plus_cameraview_HistogramView_getMaxHeight
        (JNIEnv *, jobject, jlong cppobj) {
    const histogram *h = reinterpret_cast<const histogram *>(cppobj);
    return h->get_max_height();
}
 
JNIEXPORT jint JNICALL Java_com_example_plus_cameraview_HistogramView_getHeight
        (JNIEnv *, jobject, jlong cppobj) {
    const histogram *h = reinterpret_cast<const histogram *>(cppobj);
    return h->get_height();
}
 
 
JNIEXPORT jint JNICALL Java_com_example_plus_cameraview_HistogramView_getWidth
        (JNIEnv *, jobject, jlong cppobj) {
    const histogram *h = reinterpret_cast<const histogram *>(cppobj);
    return h->get_width();
 
}
histogram.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//
// Created by Олег on 30.09.2015.
//
 
 
#include "histogram.h"
 
histogram::histogram() : width_(0), height_(0), max_height_(0)
{
}
 
void histogram::init_from_YUV420SP(unsigned char *yuv420sp, int width, int height)
{
    width_ = width;
    height_ = height;
    int frame_size = width * height;
    rgbdata_.resize( frame_size );
 
    for ( int j = 0, yp = 0; j < height; j++ ) {
        int uvp = frame_size + ( j >> 1) * width, u = 0, v = 0;
        for ( int i = 0; i < width; i++, yp++ ) {
            int y = ( 0xFF & yuv420sp[yp] ) - 16;
            if ( y < 0 ) y = 0;
            if ( (i & 1) == 0 ) {
                v = ( 0xFF & yuv420sp[uvp++] ) - 128;
                u = ( 0xFF & yuv420sp[uvp++] ) - 128;
            }
 
            const int y1192 = 1192 * y;
            int r = ( y1192 + 1634 * v );
            if ( r < 0 ) r = 0; else if ( r > 252143 ) r = 262143;
            int g = ( y1192 - 833 * v - 400 * u );
            if ( g < 0 ) g = 0; else if ( g > 252143 ) g = 262143;
            int b = ( y1192 + 2066 * u );
            if ( b < 0 ) b = 0; else if ( b > 252143 ) b = 262143;
 
            rgbdata_[yp] = 0xFF000000 | ((r << 6) & 0xFF0000) | ((g >> 2) & 0xFF00) | ((b >> 10) & 0xFF);
        }
    }
}
 
void histogram::get_histograms(int *r, int *g, int *b) const
{
    for (int bin = 0; bin < 256; bin++)
    {
        r[bin] = g[bin] = b[bin] = 0;
    }
    max_height_ = 0;
    if ( rgbdata_.empty() ) return;
 
    for (int pix = 0; pix < width_*height_; pix += 3)
    {
        const int p = rgbdata_[pix];
        const int r_pixVal = (p >> 16) & 0xff;
        const int g_pixVal = (p >> 8) & 0xff;
        const int b_pixVal = p & 0xff;
        if ( r_pixVal > 10 && r_pixVal < 245 ) {
            r[r_pixVal]++;
            if ( r[r_pixVal] > max_height_ ) max_height_ = r[r_pixVal];
        }
        if ( g_pixVal > 10 && g_pixVal < 245 ) {
            g[g_pixVal]++;
            if ( g[g_pixVal] > max_height_ ) max_height_ = g[g_pixVal];
        }
        if ( b_pixVal > 10 && b_pixVal < 245 ) {
            b[b_pixVal]++;
            if ( b[b_pixVal] > max_height_ ) max_height_ = b[b_pixVal];
        }
    }
}
 
histogram::~histogram()
{
}
histogram.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//
// Created by Олег on 30.09.2015.
//
 
#ifndef CAMERAVIEW_HISTOGRAM_H
 
#include <vector>
 
class histogram
{
public:
    histogram();
    ~histogram();
 
    void init_from_YUV420SP( unsigned char* yuv420sp, int width, int height );
    void get_histograms( int* r, int* g, int* b ) const;
    int get_max_height() const { return max_height_; }
    int get_height() const { return height_; }
    int get_width() const { return width_; }
 
protected:
    int  width_;
    int  height_;
    mutable int max_height_;
 
    std::vector<int> rgbdata_;
};
 
 
#endif //CAMERAVIEW_HISTOGRAM_H



БУДУ РАД ЛЮБОЙ ПОМОЩИ.
0
Миниатюры
Работа с камерой и NDK  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru