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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
kompozitor12345
4 / 4 / 1
Регистрация: 12.12.2010
Сообщений: 17
#1

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

01.10.2015, 12:33. Просмотров 419. Ответов 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  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2015, 12:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с камерой и NDK (Программирование Android):

Работа с камерой - Программирование Android
Имеется код:package com.mytest; import android.os.*; import android.view.*; import android.app.*; import android.hardware.*; ...

Работа с камерой - Программирование Android
Попытался поработать с камерой, но при попытке фотографирования приложение вылетает, при этом камера в эмуляторе работает, но почему то не...

Работа с камерой - Программирование Android
Когда приложение использует камеру то изображение которое идет с камеры(видеокадры) отображаются на дисплее телефона. Как сделать так чтобы...

Работа с камерой - Программирование Android
Всем привет! Есть приложение блокнот, в котором хотелось бы реализовать возможность прикрепления фото. Сделал следующим образом...

Андроид, работа с камерой - Программирование Android
Всем привет. Сразу говорю - на java не писал никогда - только delphi и немного C++. Хочется сделать приложение для Андроид 2.3.5...

Работа с камерой в Android 2.* - Программирование Android
Нужно заставить приложение выводить картинку с камеры на экран (превьюшка). Вроде проще простого, но не работает: package...

1
kompozitor12345
4 / 4 / 1
Регистрация: 12.12.2010
Сообщений: 17
01.10.2015, 17:03  [ТС] #2
Всё, разобрался, всем спасибо ) если кому интересно, хотя врятли, во всех сишных файлах надо было добавить extern "С". Хрень редкостная)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2015, 17:03
Привет! Вот еще темы с ответами:

AS и Ndk - Программирование Android
Здравствуйте На официальном сайте в разделе ndk почему- то описывается eclipse Предполагается что с AS по аналогии и типа сами...

SDK or NDK - Программирование Android
я начинающий разработчик, на данный момент не много знаю с++. 1) Что лучше изучать SDK и яву или же NDK, в будущем хочу попробовать себя...

Подключить NDK - Программирование Android
(моя 101я попытка начать работать с NDK) Чуть сдвинулся, но не хватает теории... 1) Скачал последний NDK (android-ndk-r9c) 2)...

Использование NDK - Программирование Android
Пытаюсь освоить NDK... И как всегда не хватает ЗАДАНИЙ! Не могу придумать где можно использовать (для новичка в с++)... Писать еще один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.