B4A Library OpenCV 3.x

BobsYourUncle

Member
Licensed User
Longtime User
@JordiCP this looks like a really great library! Very clever - I'm impressed! Just to confirm, will it allow me to change colors and contrast of the camera preview image in realtime? (Can the altered preview be saved?) If it works I will definitely donate generously!!
 

JordiCP

Expert
Licensed User
Longtime User
Sure, you can do all of these things with OpenCV, even from a live preview and save the modified preview. You can change a given color, or those ones that are "similar" to it (with a predefined distance function), since two consecutive frames in a preview won't necessarily give the exact same colors for an object (due to light changes, noise, ...)

However, the max resolution at which it will work "smooth" will depend on the device and the amount of operations made. Also, depending on how you want to control the camera, you can use CameraEx (larger code, but more control) or JavaCameraView (simplest code, no control).
 

biometrics

Active Member
Licensed User
Longtime User
@JordiCP

Is it possible to use a OCVJavaCameraView without a panel? I want to convert our app to a service and I can't have a panel in a service. I don't need to display the camera frames, I just want to process them in the newFrame event.

If I try initialize it and pass null for the panel parameter then I get this error, as can be expected:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.addView(android.view.View, android.view.ViewGroup$LayoutParams)' on a null object reference
 
Last edited:

JordiCP

Expert
Licensed User
Longtime User
OCVJavaCameraView (and also CameraEx), need a Panel since they are intended to be used inside an activity

The good news is that the Android camera object itself doesn't need to be in an activity. When it is initted you must link it to a preview surface, but it can be of any size, out of the screen, and not necessarily belonging to an activity.

So there are (at least) 2 options
  • Init the Android camera from inline Java in a service, and then raise a B4A event with the preview data where you will make the same processing as now (I think I have a half-made example somewhere, PM me if you are interested in it)
  • I can change the JavaCameraView behaviour so that it doesn't need a Panel (then you'll be able to call it from a service), but I can't tell you when, since I'm a bit short of time.
 

ZJP

Active Member
Licensed User
Longtime User
Hi,

Trying to make an sort of 'Plickers Card Reader' with your lib (a very nice one), i'm stuck actually with the usage of findContours1.

Do you have an example with this function?

Thanks.
 

JordiCP

Expert
Licensed User
Longtime User

ZJP

Active Member
Licensed User
Longtime User
Thanks.
How did I miss this? I have "studied" all the examples.
 

JordiCP

Expert
Licensed User
Longtime User
Please note that in the example you have both the original Java part and ALSO the B4A translation.

(These lines are also in the example, and are the equivalent of the commented Java part)
B4X:
    Dim contours As List
    contours.Initialize
    mImgProc.findContours1(mDilatedMask,contours,mHierarchy,mImgProc.RETR_LIST,mImgProc.CHAIN_APPROX_SIMPLE)
 

BarryW

Active Member
Licensed User
Longtime User

Hi sir. How about the face recognition. Is it supported?
 

JohnC

Expert
Licensed User
Longtime User
Can this lib be used to do this...

I have a database of pictures of various objects (less then 1000), and I would like to develop an app that allows the user to take a picture of one of those objects and have the app find the image in the database that is the closest match to the picture that was just taken by the user.

Can this lib be used to do that?

I'm hoping that the accuracy can be relatively high because of the limited dataset (the 1000 images) that it needs to find a match with.
 

JordiCP

Expert
Licensed User
Longtime User
Hard to say without details...
Are you talking about one object tor many objects at once? Does the background move? Is the background homogeneous? Does the source come from the device camera? Which kind of movement do they have? ....

If there is a low-level algorithm in C++ or Matlab that does it, it can be "possibly" translated to OpenCV. If this algorithm makes use of libs, then you'll have to see if there exists something similar in OpenCV.
 

JordiCP

Expert
Licensed User
Longtime User
Not in a near future, sorry
If I'm not mistaken, DNN module was part of the 'extra' modules in v3.20, so they weren't part of the official Android 3.20 release. It was moved to the 'main' modules since v3.30.

Perhaps TENSORFLOW lib from @moster67 would also suit your needs ?
 

rdkartono

Member
Licensed User
Longtime User
I am wrapping OpenCV version 4 for B4A now, and having problem with JavaCameraView. I want to make like your OCVJavaCameraView, so simple in use.
If I put JavaCamera2View.java and CameraBridgeViewBase.java in Eclipse, can compile them to B4A Library (no error).
When I am trying to load them, there is a error as attachment.

Could you help sharing your OCVJavaCameraView code ?
 

Attachments

  • error javacameraview.JPG
    23.1 KB · Views: 192

Guillermo Gonzalez

New Member
Licensed User
Dear Jordi,
I am trying to use the "OCVImgproc.fillPoly1(img As OCVMat, pts As java.util.List, color As OCVScalar)" command to define a region of interest in a Mat. Can you give me some hints how I can enter the second argument correctly? It is supposed to be an array of vertices, which have x and y coordinates.
 

moster67

Expert
Licensed User
Longtime User
Maybe something like this (not tested and values just invented):

B4X:
           Dim mImgProc As OCVImgproc
    Dim Img As OCVMat
    Img.Initialize
    Dim myScalar As OCVScalar
    myScalar.Initialize3(255,255,255)
    
    Dim p1 As OCVPoint
    p1.Initialize(4,8)
    Dim p2 As OCVPoint
    p2.Initialize(2,10)
    Dim p3 As OCVPoint
    p3.Initialize(16,6)
    Dim p4 As OCVPoint
    p4.Initialize(10,4)
    Dim p5 As OCVPoint
    p5.Initialize(12,4)
    Dim p6 As OCVPoint
    p6.Initialize(2,10)
    
    Dim arrPoint(6) As OCVPoint = Array As OCVPoint(p1,p2,p3,p4,p5,p6)
    
    Dim matPt As OCVMatOfPoint
    matPt.fromArray(arrPoint)
    Dim ppt As List
    ppt.Initialize
    ppt.Add(matPt)
    
    mImgProc.fillPoly1(Img, ppt,myScalar)
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…