12
votes

Données d'image brute de la caméra comme "645 pro"

Il y a une fois, j'ai déjà posé cette question et j'ai aussi une bonne réponse:

Je cherche ce forum de haut en bas, mais je ne pouvais pas trouver ce que je vraiment besoin. Je veux obtenir des données d'image brutes de la caméra. Jusqu'à maintenant J'ai essayé d'obtenir les données de l'imagétasamplebuffer à partir de cela méthode CaptureStillimageAsynchroneBromConnection: AchionHandler: Et Pour l'écrire à un objet Nsdata, mais cela n'a pas fonctionné. Peut-être que je suis sur la mauvaise piste ou peut-être que je fais juste le mal. Ce que je ne veux pas, c'est pour que l'image soit comprimée de quelque manière que ce soit.

Le moyen facile est d'utiliser JPEGSTILLIMAGENSDataREPRESENTATION: de AvCaptureestillimageOutput, mais comme je l'ai dit, je ne veux pas que ce soit comprimé.

merci!

données d'image brute de la caméra

Je pensais pouvoir travailler avec cela, mais j'ai finalement remarqué que j'ai besoin d'obtenir des données d'image brutes plus directement de manière similaire à celle de "645 pro".

645 pro: RAW REDUX

Les images sur ce site Montrez qu'ils obtiennent les données brutes avant que toute compression JPEG ne soit terminée. C'est ce que je veux faire. Je suppose que j'ai besoin de transformer imagétatasambuffer mais je ne vois pas un moyen de le faire complètement sans compression. "645 Pro" enregistre également ses images dans TIFF, donc je pense qu'il utilise au moins une bibliothèque supplémentaire.

Je ne veux pas créer une application photo mais j'ai besoin de la meilleure qualité que je dois vérifier certaines fonctionnalités dans une image.

Merci!

EDIT 1: Ainsi, après avoir essayé et rechercher dans différentes directions pendant un moment, j'ai décidé de donner une mise à jour de statut.

L'objectif final de ce projet est de vérifier certaines fonctionnalités dans une image qui se passera avec l'aide de OPENCV . Mais jusqu'à ce que l'application puisse le faire sur le téléphone, j'essaie d'obtenir principalement des images non compressées hors du téléphone pour les analyser sur l'ordinateur.

Par conséquent, je souhaite enregistrer l'instance Nsdata contenant le Les octets de BGRA non compressés sont retournés de la caméra "Je suis capable d'obtenir avec le code de Brad Larson sous forme de fichier BMP ou TIFF. Comme je l'ai dit dans un commentaire, j'ai essayé d'utiliser OpenCV pour cela (ce sera nécessaire de toute façon). Mais le meilleur que je puisse faire était de le transformer en uiimage avec une fonction de Vision informatique parle . xxx

ImageMagick - Approche

Une autre chose que j'ai essayée utilisait ImageMagick Comme suggéré dans Un autre message . Mais je n'ai pas pu trouver un moyen de le faire sans utiliser quelque chose comme uiimagepngrepresentation ou uiimagejpegrepresentation .

Pour le moment, j'essaie de faire quelque chose avec libtiff utilisant ce Tutoriel .

Peut-être peut-être Quelqu'un a une idée ou sait un moyen beaucoup plus facile de convertir mon objet tampon en une image non compressée. Merci d'avance à nouveau!

edit 2:

J'ai trouvé quelque chose! Et je dois dire que j'étais très aveugle. xxx

Je dois juste utiliser la fonction Imwrite de OpenCV. De cette façon, je reçois des fichiers TIFF environ 30 Mo directement après la polarisation Beyer!


2 commentaires

J'ai trouvé cette réponse dans 10 secondes de recherche: Stackoverflow.com/a/10865206/96716


Merci Dustin, j'ai déjà craint quelque chose comme ça, j'espérais juste que quelqu'un puisse me donner un indice ou quelque chose comme ça. Et merci à David H mais j'ai déjà parcouru cela et cela n'aide pas vraiment mon cas ou du moins, je n'ai pas pu comprendre comment. Mais je suis reconnaissant pour chaque indice!


4 Réponses :


17
votes

wow, ce message de blog était quelque chose de spécial. Un grand nombre de mots pour simplement indiquer qu'ils obtiennent l'échantillon tampon d'octets que Apple vous remet de l'image fixe. Il n'y a rien de particulièrement innovant quant à leur approche et je connais un certain nombre d'applications de caméra qui le font.

Vous pouvez obtenir sur les octets bruts retournés d'une photo prise avec un AVCaptureStillimageOutput utilisant le code comme suit: P>

[photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
    CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer);
    CVPixelBufferLockBaseAddress(cameraFrame, 0);
    GLubyte *rawImageBytes = CVPixelBufferGetBaseAddress(cameraFrame);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cameraFrame);
    NSData *dataForRawBytes = [NSData dataWithBytes:rawImageBytes length:bytesPerRow * CVPixelBufferGetHeight(cameraFrame)];
    // Do whatever with your bytes

    CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
}];


1 commentaires

Je vous remercie beaucoup pour votre aide. Il est bon de savoir que je n'étais pas sur une piste complètement incorrecte. J'espère que je ne poussez pas votre patience, mais connaissez-vous un moyen simple de changer cela dans un bitmap? Je pense à utiliser Opencv de la même manière que cela se fait dans un autre message Link Je veux juste savoir si je manque beaucoup plus facilement. Et merci encore une fois, j'ai frappé un mur avec ça depuis un moment maintenant.



2
votes

Alors que le noyau de la réponse vient de Brad à iOS: Obtenir des données pixel par pixel de la caméra , un élément clé est tout à fait claire de la réponse de Brad. Il est caché dans « une fois que vous avez votre session de capture configurée ... ».

Vous devez définir les OutputSettings correctes pour votre AVCaptureStillImageOutput .

Par exemple, le réglage du kCVPixelBufferPixelFormatTypeKey kCVPixelFormatType_420YpCbCr8BiPlanarFullRange vous donnera un YCbCr imageDataSampleBuffer captureStillImageAsynchronouslyFromConnection: completionHandler: , que vous pouvez ensuite manipuler au contenu de votre coeur.


1 commentaires

Une chose à conscience de: kcvpixelbufferpixelformattypekekey est un INT, vous devrez donc l'envelopper dans un nombre NSNUMBER lors de l'ajout à votre dictionnaire. En outre, sous ARC, vous devrez lancer manuellement la valeur réelle à ID .



5
votes

Je pourrais le résoudre avec OpenCV. Merci à tous ceux qui m'ont aidé. XXX

Je dois juste utiliser la fonction Imwrite de OpenCV. De cette façon, je reçois des fichiers BMP environ 24 Mo directement après le filtre Bayer!


0 commentaires

0
votes

Comme @wildaker mentionné, pour un code spécifique de fonctionner, vous devez être sûr du format de pixel que l'appareil photo vous envoie. Le code de @thomketler fonctionnera s'il est défini pour le format RGBA 32 bits.

Voici un code pour la valeur de la caméra YUV, à l'aide de OPENCV: P>

cv::Mat convertImage(CMSampleBufferRef sampleBuffer)
{
    CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(cameraFrame, 0);

    int w = (int)CVPixelBufferGetWidth(cameraFrame);
    int h = (int)CVPixelBufferGetHeight(cameraFrame);
    void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(cameraFrame, 0);

    cv::Mat img_buffer(h+h/2, w, CV_8UC1, (uchar *)baseAddress);
    cv::Mat cam_frame;
    cv::cvtColor(img_buffer, cam_frame, cv::COLOR_YUV2BGR_NV21);
    cam_frame = cam_frame.t();

    //End processing
    CVPixelBufferUnlockBaseAddress( cameraFrame, 0 );

    return cam_frame;
}


0 commentaires