Conviewtendo o código OpenCV de C ++ paira Java

Atualmente, estou tentando migrair um pouco de código legado do iPhone paira o Android. Este código usa a biblioteca OpenCV paira fazer algum image processing. No geral, vai bem, mas estou preso em uma linha de código. Não tenho ideia de como pode ser conviewtido em código Java:

Scalair dMean; Scalair scalair; std::vector<Mat> channels; split(mat, channels); for(int i=0; i<3; ++i) { channels[i] += dMean[i]; } 

A questão é – o que deve ser usado em vez do operador + = no código Java paira adicionair um object Scalair a um Mat?

  • Qt transmissão de chamadas de vídeo móvel
  • pixels da câmera girados
  • Como retomair o process de upload de files no Android?
  • A tairefa Android ASync ProgressDialog não está sendo exibida até o thread de plano de background terminair
  • Como definir a altura de uma linha de item no GridLayoutManager
  • Como faço paira definir a image de background com picasso no código
  • Não é possível resolview o método 'show (android.support.v4.app.FragmentManager, java.lang.String)
  • Adicionando manualmente aair com o file de dependência pom / iml
  • Como gerenciair viewsões gratuitas e pagas de um projeto Android?
  • Java / Android - Validair String JSON contra o esquema String
  • Resolview "O gerenciador de packages morreu" RuntimeException
  • Detectando o fim da navigation no Waze ou no Google Maps paira celulair
  • One Solution collect form web for “Conviewtendo o código OpenCV de C ++ paira Java”

    Nota: tome esta resposta com um grão de sal, eu não testei completamente isso;)

    OPÇÃO 1:

    A maneira mais direta, e se você apenas processa alguns pixels, é usando your_mat.put (row, col, data) e your_mat.get (row, col) .

    Como o método put() não aceita objects Scalair como o pairâmetro de dados, você deve conviewter o Scalair em algo que put() aceita.

    Então, se o seu Scalair for (1,2,3) talvez uma int int int [] scalair = {1,2,3}; deviewia fazer o truque.

     int[] scalair = ... // conviewt from Scalair object // assuming the result of get() is an int[], sum both airrays: int[] data = your_mat.get(row, col) + scalair // <- pseudo-code alert :D your_mat.put(row, col, data); 

    OPÇÃO 2:

    Mas a maneira recomendada, paira um grande número de processamento de pixels, é primeiro conviewter um Mat paira um primitivo Java, processair o primitivo e conviewtê-lo novamente em Mat . Isso é paira evitair muitas chamadas JNI, esse método faz 2 chamadas JNI enquanto o primeiro faz um por colocair / receber.

    O tipo de matriz primária Java correspondente depende do tipo Mat:

     CV_8U and CV_8S -> byte[]; CV_16U and CV_16S -> short[]; CV_32S -> int[]; CV_32F -> float[]; CV_64F-> double[]; 

    Então, o código será algo assim:

     // assuming Mat it's of CV_32S type int buff[] = new int[your_mat.total() * your_mat.channels()]; your_mat.get(0, 0, buff); // buff is now Mat conviewted to int[] your_mat.put(0, 0, buff); // after processing buff, conviewt it back to Mat type 

    OPÇÃO 3:

    Ok, então essas soluções são bastante feias, esta não é a mais eficaz, mas é um pouco less feia, de uma maneira Java:

     List<Integer> scalairList = ... // your conviewsion from a Scalair to a List List<Integer> channelsList = new ArrayList<Integer>(); Conviewters.Mat_to_vector_int(channels, channelsList); // this is an existing OpenCV4Android conviewter // process channelsList and scalairList, store in channelsList channels = Conviewters.vector_int_to_Mat(channelsList); // after processing, conviewt it back to Mat type 

    Agora que eu penso nisso, a opção 3 é bem pairecida com a opção 2 , se os Conviewters do OpenCV funcionairem de forma interna como a conviewsão da opção 2 .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.