ANDROID - couleur de la détection à l'aide d'openCV - comment?
mon objectif est d'afficher une battues image en utilisant l'espace de couleur HSV en sorte que seuls les objets jaunes seront affichés. j'ai utiliser ce code (basé sur un code donné par le openCV 2.3.1 android échantillons):
protected Bitmap processFrame(VideoCapture capture) {
//capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
//Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
//Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
bmp.recycle();
return null;
}
la base (Résumé)classe contient le "run" de la méthode:
protected abstract Bitmap processFrame(VideoCapture capture);
public void run() {
...
bmp = processFrame(mCamera);
...
canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null);
...
}
- je obtenir ce déformée aperçu que je pense que je peux comprendre (HSV format) mais pourquoi est-il de se répéter (j'ai réussit à tracer une ligne verte pour le souligner) 4 temps? et qu'est-ce que la ligne horizontale noire?
ce que je fais mal?
une dernière chose, quelle est la logique derrière:
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
pourquoi est-il COLOR_RGB2HSV? il ne faut pas être COLOR_HSV2RGB?
Disons que je v passé ce problème, comment puis-je faire une image en niveau de gris avec du jaune d'objets dans leur propre couleur? j'ai pensé à l'aide de la Base.inRange() la méthode mais lorsque je fais ceci, j'obtiens un écran noir.
oui, je suppose que je regarde comme un idiot, mais j'ai besoin de commencer quelque part, n'est-ce pas?
10x!
Mise à jour 1:
j'ai essayé de faire RVB->HSV->RVB de cette façon:
@Override
protected Bitmap processFrame(VideoCapture capture) {
//capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
//Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB);
Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0);
//Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_BGR2RGB, 4);
//Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba);
Imgproc.cvtColor(mHSV,mRgba , Imgproc.COLOR_HSV2RGB,0);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
bmp.recycle();
return null;
}
et j'ai obtenu:
?
Mise à jour 2:
je comprends enfin que, avant l'établissement d'un cadre, il doit être converti en RVBUN de l'espace.
alors j'ai essayé aujourd'hui le seuil avec le code comme suit:
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0);
Core.inRange(mHSV, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mHSVThreshed);
Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0);
Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 0);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
mais maintenant, il me donne la force d'arrêt... des idées?
Hé là-bas. Je
m really sorry but it has been a while since i
v travaillé avec openCV, Plus je n'ai pas le code plus. Je vous conseille de regarder ici: docs.opencv.org/doc/tutorials/highgui/video-write/.... Bonne chance, le travail acharné porte finalement 🙂OriginalL'auteur gor | 2012-02-25
Vous devez vous connecter pour publier un commentaire.
Je pense que mHSVThreshed est un binaire mat
alors peut-être cette ligne :
devrait changer :
J'ai passé beaucoup de temps à traiter avec les "montrer" problème aussi...
espérons que cette aide...
Hey je veux ajouter une matrice sur en surbrillance la partie de l'image, pouvez-vous me guider?
Ce type de matrice? Tu veux dire dessiner quelque chose sur elle comme AR?
OriginalL'auteur Ethan Chen
amis. je vous donne le résultat de 1 mois de travail acharné et de l'aide à des amis à travers l'océan:
Ethan était de droite. mais le code a besoin d'une certaine fixation.
le code:
tout d'abord, le tapis est binaire 0 ou 255 afin de le transformer en niveau de gris est plus "naturel". ensuite, la conversion de HSVto RGBis en fait HSV-BGR!!. et dernière chose, c'est que l'aperçu attend RGBA Bitmap.
c'est tout. espérons que d'autres peuvent bénéficier de ce post. SHALOM!
super! heureux, j'ai réussi à vous aider..
pourriez-vous s'il vous plaît ajouter les valeurs de mRgba,mHSV,mHSVThreshed,mRgba2?
pas sûr de comprendre la question + cela a été posté années en arrière, et le code n'est plus accessible..
de nombreux Imgproc.cvtColor... donc pour inRange nous avons juste besoin de HSC en entrée et GRIS comme la sortie (RGB2HSV) et (GRAY2RGB)
OriginalL'auteur gor
Aussi loin que je le vois vous allez chercher l'image dans RGBA et l'enregistrer sous le nom de "mHSV"
capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
donc vous devriez y stocker comme mRgba
dans le cvtColor vous avez besoin pour transformer le VHS via COLOR_RGBA2HSV. En supposant que vous avez changé les noms, ce serait:
Et je suppose que cette répétition des images vient de la "4" en vous cvtColor fonction depuis votre HSV image aura seulement 3 canaux. Mettre dans un 0 de là et il devrait être détecté automatiquement...
J'espère que cela aide...
10x gars. je vais faire un essai..
j'ai réussit à jour le Post, vous devriez vérifier..
Avez-vous essayez de déboguer pour savoir exactement où il renvoie une erreur? Comme les commandes qui semblent être terminée sans erreur et où est-il le quitter?
je l'ai fait. apparemment, l'application n'arrive jamais à la ligne : Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_BGR2RGBA, 0);
OriginalL'auteur evident
pourquoi est-il COLOR_RGB2HSV? il ne faut pas être COLOR_HSV2RGB?
Je dirais qu'il se doit :).
Ressemble à un problème sur la façon d'opencv attrape les pixels. Assurez-vous que votre entrée et de sortie des images ont la même taille et le nombre de canaux.
Ce
semble aussi bizarre pour moi, Êtes-vous le stockage de l'image RGBA que vous obtenez dans une image au format HSV?
Qui pourrait expliquer le problème.
Essayez de faire quelque chose comme ça : RGB(capture de la récupérer) => HSV(cvt couleur) => détection de couleur => RVB (cvt couleur)
OriginalL'auteur jlengrand