ครั้งหนึ่งฉันเคยถามคำถามนี้ไปแล้ว และฉันก็ได้รับคำตอบที่ดีเช่นกัน:
ฉันค้นหาฟอรัมนี้ขึ้น ๆ ลง ๆ แต่ไม่พบสิ่งที่ฉันต้องการจริงๆ ฉันต้องการรับข้อมูลภาพดิบจากกล้อง จนถึงตอนนี้ฉันพยายามดึงข้อมูลออกจาก imageDataSampleBuffer จากเมธอดนั้น captureStillImageAsynchronouslyFromConnection:completionHandler: และเขียนลงในวัตถุ NSData แต่นั่นไม่ได้ผล บางทีฉันอาจจะผิดเส้นทางหรือบางทีฉันแค่ทำผิด สิ่งที่ฉันไม่ต้องการคือต้องบีบอัดรูปภาพด้วยวิธีใดก็ตาม
วิธีง่าย ๆ คือใช้ jpegStillImageNSDataRepresentation: จาก AVCaptureStillImageOutput แต่อย่างที่ฉันบอกว่าฉันไม่ต้องการให้มันถูกบีบอัด
ขอบคุณ!
ฉันคิดว่าฉันสามารถแก้ไขปัญหานี้ได้ แต่ในที่สุดฉันก็สังเกตเห็นว่าฉันต้องได้รับข้อมูลภาพดิบโดยตรงมากขึ้น ในลักษณะเดียวกับที่ทำใน "645 PRO"
รูปภาพบนไซต์นั้นแสดงว่าได้รับข้อมูลดิบก่อนที่การบีบอัด JPEG จะเสร็จสิ้น นั่นคือสิ่งที่ฉันต้องการจะทำ ฉันเดาว่าฉันต้องแปลง imageDataSampleBuffer
แต่ฉันไม่เห็นวิธีที่จะทำได้อย่างสมบูรณ์หากไม่มีการบีบอัด "645 PRO" ยังบันทึกรูปภาพใน TIFF ด้วย ดังนั้นฉันคิดว่ามันใช้ไลบรารีเพิ่มเติมอย่างน้อยหนึ่งไลบรารี
ฉันไม่ต้องการสร้างแอปรูปภาพ แต่ฉันต้องการคุณภาพที่ดีที่สุดเพื่อตรวจสอบคุณสมบัติบางอย่างในรูปภาพ
ขอบคุณ!
แก้ไข 1: หลังจากลองค้นหาในทิศทางต่างๆ มาสักระยะหนึ่งแล้ว ฉันจึงตัดสินใจอัปเดตสถานะ
เป้าหมายสุดท้ายของโปรเจ็กต์นี้คือการตรวจสอบคุณสมบัติบางอย่างในรูปภาพซึ่งจะเกิดขึ้นด้วยความช่วยเหลือของ opencv แต่จนกว่าแอปจะสามารถทำได้บนโทรศัพท์ ฉันกำลังพยายามดึงรูปภาพที่ไม่มีการบีบอัดเป็นส่วนใหญ่ออกจากโทรศัพท์เพื่อวิเคราะห์บนคอมพิวเตอร์
ดังนั้นฉันต้องการบันทึก "อินสแตนซ์ NSData ที่มีไบต์ BGRA ที่ไม่บีบอัดที่ส่งคืนจากกล้อง" ฉันสามารถรับโค้ดของ Brad Larson เป็นไฟล์ bmp หรือ TIFF ได้ อย่างที่ฉันพูดในความคิดเห็น ฉันลองใช้ opencv สำหรับสิ่งนี้ (มันจะจำเป็นอยู่แล้ว) แต่สิ่งที่ดีที่สุดที่ฉันทำได้คือเปลี่ยนให้เป็น UIImage ด้วยฟังก์ชันจาก การพูดคุยเรื่องคอมพิวเตอร์วิทัศน์
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
cv::Mat frame(height, width, CV_8UC4, (void*)baseAddress);
UIImage *testImag = [UIImage imageWithMat:frame andImageOrientation:UIImageOrientationUp];
//imageWithMat... being the function from Computer Vision Talks which I can post if someone wants to see it
ImageMagick - แนวทาง
อีกสิ่งที่ฉันลองคือใช้ ImageMagick ตามที่แนะนำใน โพสต์อื่น . แต่ฉันไม่สามารถหาวิธีทำได้โดยไม่ใช้บางอย่างเช่น UIImagePNGRepresentation
หรือ UIImageJPEGRepresentation
สำหรับตอนนี้ฉันกำลังพยายามทำอะไรบางอย่างกับ libtiff โดยใช้บทช่วยสอน.
อาจมีคนมีความคิดหรือรู้วิธีที่ง่ายกว่ามากในการแปลงวัตถุบัฟเฟอร์ของฉันให้เป็นรูปภาพที่ไม่มีการบีบอัด ขอขอบคุณล่วงหน้าอีกครั้ง!
แก้ไข 2:
ฉันพบบางสิ่งบางอย่าง! และฉันต้องบอกว่าฉันตาบอดมาก
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
cv::Mat frame(height, width, CV_8UC4, (void*)baseAddress);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"ocv%d.TIFF", picNum]];
const char* cPath = [filePath cStringUsingEncoding:NSMacOSRomanStringEncoding];
const cv::string newPaths = (const cv::string)cPath;
cv::imwrite(newPaths, frame);
ฉันแค่ต้องใช้ฟังก์ชัน imwrite จาก opencv วิธีนี้ฉันจะได้ไฟล์ TIFF ประมาณ 30 MB โดยตรงหลังจาก beyer-Polarization!