8

Tôi đang phát triển một ứng dụng cho iPhone bằng cách sử dụng opencv. Tôi phải sử dụng phương pháp solvePnPRansac:tạo ma trận máy ảnh opencv cho iPhone 5 resolvepnp

http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html

Đối với phương pháp này tôi cần phải cung cấp một ma trận camera:
__ __
| fx 0 cx |
| 0 fy cy |
| _0 0 1 _ |

trong đó cx và cy đại diện cho vị trí pixel trung tâm của hình ảnh và fx và fy đại diện cho độ dài tiêu cự, nhưng đó là tất cả tài liệu nói. Tôi không chắc chắn những gì để cung cấp cho các độ dài tiêu cự. IPhone 5 có độ dài tiêu cự là 4,1 mm, nhưng tôi không nghĩ rằng giá trị này có thể sử dụng được.

Tôi đã kiểm tra một trang web khác:

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

trong đó cho thấy cách opencv tạo ra ma trận camera. Ở đây nó nói rằng độ dài tiêu cự được đo bằng đơn vị pixel.

Tôi đã kiểm tra một trang web khác:

http://www.velocityreviews.com/forums/t500283-focal-length-in-pixels.html

(khoảng một nửa đường xuống) nó nói rằng độ dài tiêu cự có thể được chuyển đổi từ đơn vị milimét để pixel bằng cách sử dụng phương trình: fx = fy = focalMM * pixelDensity/25,4;

Một liên kết khác tôi thấy rằng fx = focalMM * width/(sensorSizeMM); fy = focalMM * length/(sensorSizeMM);

Tôi không chắc chắn về các phương trình này và cách tạo đúng ma trận này.

Bất kỳ sự giúp đỡ, tư vấn, hoặc liên kết về cách tạo một ma trận camera chính xác (đặc biệt dành cho iPhone 5) sẽ được đánh giá rất nhiều,

Isaac

tái bút: Tôi nghĩ rằng (fx/fy) hoặc (fy/fx) có thể bằng tỉ lệ khung hình của máy ảnh, nhưng điều đó có thể hoàn toàn sai.

UPDATE:

Pixel coordinates to 3D line (opencv)

sử dụng liên kết này, tôi có thể tìm ra cách họ muốn fx và fy phải được định dạng bởi vì họ sử dụng nó để mở rộng góc so với khoảng cách của họ từ trung tâm. do đó, fx và fy có khả năng theo pixel/(độ dài đơn vị) nhưng im vẫn không chắc chắn chiều dài đơn vị này cần phải là bao nhiêu, nó có thể tùy ý miễn là x và y được thu nhỏ với nhau không?

Trả lời

10

Bạn có thể nhận được ước tính ban đầu về độ dài tiêu cự trong pixel chia độ dài tiêu cự tính bằng mm theo chiều rộng của điểm ảnh của cảm biến của máy ảnh (CCD, CMOS, bất kỳ thứ gì).

Bạn lấy tài liệu cũ từ hướng dẫn sử dụng máy ảnh hoặc đọc từ tiêu đề EXIF ​​của hình ảnh được chụp ở độ phân giải đầy đủ.Việc tìm ra thứ hai phức tạp hơn một chút: bạn có thể tra cứu trên trang web của interwebs tờ thông số của cảm biến, nếu bạn biết số nhà sản xuất và số mô hình của nó, hoặc bạn có thể chỉ chia chiều rộng tổng thể của vùng nhạy cảm cho số pixel trên bên.

Thông tin khác vắng mặt, thường giả thiết rằng các pixel là hình vuông (nghĩa là fx == fy) và cảm biến là trực giao với trục tiêu cự của ống kính (tức là cụm từ trong hàng đầu tiên và cột thứ hai của ma trận máy ảnh bằng không). Ngoài ra, các tọa độ điểm ảnh của điểm chính (cx, cy) thường khó ước lượng chính xác mà không có giàn hiệu chuẩn được thiết kế cẩn thận và quy trình hiệu chuẩn được thực hiện cẩn thận (vì chúng thực sự bị nhầm lẫn với bản dịch máy ảnh song song với hình ảnh máy bay). Vì vậy, tốt nhất là chỉ cần đặt chúng bằng trung tâm hình học hình học của hình ảnh, trừ khi bạn biết rằng hình ảnh đã bị cắt không đối xứng.

Do đó, kiểu máy ảnh đơn giản nhất của bạn chỉ có một tham số không xác định, độ dài tiêu cự f = fx = fy.

Lời khuyên: trong ứng dụng của bạn thường thuận tiện hơn để mang theo góc nhìn trường ngang (hoặc dọc), thay vì độ dài tiêu cự tính bằng pixel. Điều này là bởi vì FOV là bất biến để nhân rộng hình ảnh.

+0

Cảm ơn bạn đã phản hồi, tôi đã tìm thấy thông tin và rất hữu ích. Chỉ một câu hỏi nhanh nữa thôi. Với lĩnh vực góc nhìn, tôi đã tìm thấy trực tuyến mà fy = fx = cx/(tan ((horizontalAngle)/2)) đây có phải là công thức mà bạn đề nghị không? – Isaac

+0

cũng có, tôi vẫn có thể nhận được một vector liên quan đến máy ảnh của tôi theo cách này nếu tôi xây dựng fx của tôi theo cách này: http://stackoverflow.com/questions/3107771/pixel-coordinates-to-3d-line-opencv?rq = 1 – Isaac

+0

upvote cho chỉ ra FoV là thuận lợi như một tham số vì nó là độc lập quy mô – hAcKnRoCk

6

"Độ dài tiêu cự" mà bạn đang xử lý ở đây chỉ đơn giản là yếu tố mở rộng từ các đối tượng trên thế giới tới pixel camera, được sử dụng trong kiểu máy ảnh pinhole (Wikipedia link)). f, một đối tượng kích thước L ở khoảng cách (vuông góc với máy ảnh) z, sẽ f * L/z pixel.

Vì vậy, bạn có thể ước lượng độ dài tiêu cự bằng cách đặt một đối tượng có kích thước đã biết ở khoảng cách đã biết của máy ảnh và đo kích thước của nó trong ảnh. Bạn có thể giả định poin trung tâm t là trung tâm của hình ảnh. Bạn chắc chắn không nên bỏ qua sự biến dạng của ống kính (thông số dist_coef trong resolvePnPRansac).

Trong thực tế, cách tốt nhất để có được hệ số ma trận và biến dạng máy ảnh là sử dụng công cụ hiệu chỉnh máy ảnh. Bạn có thể tải xuống và sử dụng phần mềm camera_calib MRPT từ this link, cũng có video hướng dẫn here. Nếu bạn sử dụng MATLAB, hãy truy cập Camera Calibration Toolbox.

+0

Cảm ơn bạn đã trả lời của bạn, tôi nghĩ rằng tôi sẽ chỉ đơn giản là băng video một bàn cờ với máy ảnh iphone 5 và sử dụng liên kết thứ hai bạn đã gửi. Bạn có nghĩ rằng có thể có một ma trận máy ảnh premade và hệ số méo cho iphone 5? – Isaac

+3

@Isaac: Tôi không biết bất kỳ ma trận máy ảnh được tạo sẵn nào cho Iphone 5, nhưng bạn có thể đăng kết quả hiệu chuẩn cho máy của bạn ;-) – Milo

4

Ở đây bạn có một bảng với spec của máy ảnh cho iPhone 4 và 5. Việc tính toán là:

double f = 4.1; 
double resX = (double)(sourceImage.cols); 
double resY = (double)(sourceImage.rows); 
double sensorSizeX = 4.89; 
double sensorSizeY = 3.67; 
double fx = f * resX/sensorSizeX; 
double fy = f * resY/sensorSizeY; 
double cx = resX/2.; 
double cy = resY/2.; 
+1

trích dẫn cần thiết. –

1

Hãy thử điều này:

func getCamMatrix()->(Float, Float, Float, Float) 
{ 

    let format:AVCaptureDeviceFormat? = deviceInput?.device.activeFormat 
    let fDesc:CMFormatDescriptionRef = format!.formatDescription 

    let dim:CGSize = CMVideoFormatDescriptionGetPresentationDimensions(fDesc, true, true) 

    // dim = dimensioni immagine finale 
    let cx:Float = Float(dim.width)/2.0; 
    let cy:Float = Float(dim.height)/2.0; 

    let HFOV : Float = format!.videoFieldOfView 
    let VFOV : Float = ((HFOV)/cx)*cy 

    let fx:Float = abs(Float(dim.width)/(2 * tan(HFOV/180 * Float(M_PI)/2))); 
    let fy:Float = abs(Float(dim.height)/(2 * tan(VFOV/180 * Float(M_PI)/2))); 

    return (fx, fy, cx, cy) 
} 
1

Cũ chủ đề, vấn đề hiện tại.

Như Milo và Isaac đề cập sau câu trả lời Milo, có vẻ là không có "chung" params sẵn cho, nói rằng, iPhone 5.

Đối với những gì nó có giá trị, đây là kết quả của một hoạt động với Công cụ hiệu chỉnh MRPT, với iPhone cũ tốt 5:

[CAMERA_PARAMS] 
resolution=[3264 2448] 
cx=1668.87585 
cy=1226.19712 
fx=3288.47697 
fy=3078.59787 
dist=[-7.416752e-02 1.562157e+00 1.236471e-03 1.237955e-03 -5.378571e+00] 

Average err. of reprojection: 1.06726 pixels (OpenCV error=1.06726) 

Lưu ý rằng dist có nghĩa là méo ở đây.

Tôi đang tiến hành thử nghiệm trên một dự án đồ chơi, với các thông số này --- loại ok.Nếu bạn sử dụng chúng trên dự án của riêng bạn, xin lưu ý rằng chúng có thể khó đủ để bắt đầu. Tốt nhất là làm theo đề nghị của Milo với dữ liệu của riêng bạn. Công cụ MRPT khá dễ sử dụng, với bảng kiểm tra mà chúng cung cấp. Hy vọng điều này sẽ giúp bắt đầu!