il mio obiettivo è visualizzare un'immagine trebbiata utilizzando lo spazio colore HSV in modo che vengano mostrati solo gli oggetti gialli. io uso questo codice (sulla base di un codice proposta dal OpenCV 2.3.1 campioni Android):ANDROID - rilevamento del colore tramite openCV - come?
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;
}
base (Abstract) classe contiene il metodo "run":
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);
...
}
ottengo questo anteprima distorta che penso di poter capire (formato HSV), ma perché si ripete da sola (ho disegnato una linea verde per enfatizzarla) 4 volte? e qual è la linea nera orizzontale? cosa sto facendo di sbagliato?
un'ultima cosa, qual è la logica che sta dietro:
Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4);
perché è COLOR_RGB2HSV? non dovrebbe essere COLOR_HSV2RGB?
Diciamo che ho superato questo problema, come posso creare un'immagine a livello di grigio con gli oggetti gialli nel loro colore nativo? Ho pensato di usare il metodo Core.inRange() ma quando lo faccio ottengo lo schermo nero.
sì, credo di sembrare un cretino totale ma ho bisogno di partire da qualche parte, no?
10x!
Update 1: ho cercato di fare RGB-> HSV> RGB in questo modo:
@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;
}
ed ho ottenuto:
?
Aggiornamento 2:
ho finalmente capito che prima di un frame, deve essere convertito in RGB Un spazio. così ho provato oggi la soglia con il codice come segue:
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);
ma ora mi dà forza di spegnimento ... tutte le idee?
So che è qualche tempo fa e non è il modo corretto per chiedere - ma hai fatto un tutorial per questo? dato che non riesco a far funzionare VideoCapture, sarei lieto se tu potessi fornire il tuo codice o parti del tuo codice su github. Grazie mille – user1651460
Ehi lì. Sono davvero dispiaciuto, ma è da un po 'che non lavoro con OpenCV, in più non ho più il codice. Ti consiglio di guardare qui: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui. Buona fortuna, il duro lavoro paga alla fine :) – gor