2017-12-30 86 views
1

내 학부 논문의 경우 openCV를 사용하여 도미노 타일을 감지하는 iPhone 응용 프로그램을 연구 중입니다. 가까운 지역에서는 감지가 잘되지만 카메라가 기울어 져 있으면 멀리 떨어진 곳에서 타일을 감지하기가 어렵습니다. 이 문제를 해결하기위한 내 접근 방식은 몇 가지 공간 계산을 수행하고자합니다. 이를 위해 2D 픽셀 값을 월드 좌표로 변환하고 벡터로 새 3D 위치를 계산 한 다음이 좌표를 다시 2D로 변환 한 다음 그 위치에서 색상/모양을 확인해야합니다.OpenCV 2D 픽셀에서 3D 좌표 얻기

또한 증강 현실 추가를 위해 3D 위치를 알아야합니다.

내가이 링크 create opencv camera matrix for iPhone 5 solvepnp

에게 내가 코어 모션에서 얻을 카메라의 Rotationmatrix 물마루있어 카메라 매트릭스.

내가 종이에 필요한 결정적인 효과를 얻지 못하면 Aruco 마커를 사용하는 것이 나의 최후의 수단이 될 것입니다.

이제 내 질문은, 내가 계산할 수있는 위치와 원의 거리를 알면 타일을 5라고 말합니다. mm/인치 단위로 측정 할 필요가 없으며 측정하지 않고 벡터로 살 수 있습니다.

카메라를 자유롭게 회전 할 수 있어야합니다.

3D로 2D 좌표를 계산할 수 있도록 계산 sm '= A [R | t] M'을 반전 시키려고했습니다. 하지만 나는 종이 에서조차 [R | t]를 뒤집어 쓴 채로 붙어 있습니다. 그리고 나는 그것을 어떻게 신속하게 또는 C++에서 할 수 있을지 모르겠습니다.

나는 등 책 포럼에 너무 많은 다른 게시물을 읽고 난 완전히 붙어 오전 당신이 내게 줄 수있는 도움/입력을 주셔서 감사합니다. 그렇지 않으면 나는 망했다.

도움을 주셔서 대단히 감사합니다.

업데이트 : 카메라의 각도로 회전 및 번역 벡터를 얻을 수 있었다 Micka에 의해 제안 된 solvePnP를 ​​사용하여

. 당신은 각각의 3D 세계 좌표를 이미지에서 여러 2D 포인트를 확인하고 알 수있는 경우 (단위 : mm, cm, 인치, ...), 당신은 3D 세계에 좌표 알려진에서 점을 투사 할 수있는 메커니즘을 얻을 수 있다는 것을 의미 이미지의 각 2D 좌표 (opencv projectPoints 함수를 사용하십시오).

까지 내 옆에 해결하는 것입니다 무엇

내가 solvePnP 중 수신 행렬의 역에 ozlsn의 접근 방식을 따를 필요로하는 곳에 3D에 2D에서 번역, 좌표입니다.

업데이트 2 : 지금보기를 구부림하고 경우 tile from top Down

: 나는 타일과 3 차원 세계에서의 위치를 ​​감지 할 수있는에 아주 잘 따라 얻고 하향식보기로 , 내 계산이 더 이상 작동하지 않습니다. 예를 들어, I는 9 도트 군의 하단과 90 ° 각도 분할 용 블랙 바의 중앙을 확인한다. > 중동 에지 - -> 바 센터와 Corner2 -> 중동 에지 - 코너 컴퓨터 경우 중간에 줄이 발견되고 타일의 위치를 ​​찾을 수있는 것보다> 바 센터는 모두 90 ° 각도입니다.

보기가 각도로 표시되면이 각도는 130 ° 및 50 °라고 말하면서 원근감 때문에 이동됩니다. (나는 나중에 이미지를 제공 할 것이다).

아이디어는 이제 solvePNP를 4 포인트 (하단 가장자리 + 중간)로 만들고 solvePNP를 닫은 다음 필요한 점들과 가운데 막대를 2 차원 위치에서 3d 위치로 회전합니다 (높이는 관련성이 없어야합니까?). 그러면 각도가 90 °이고 다른 필요한 거리 계산도 수행하면 번역 된 점을 확인할 수 있습니다. Markings for Problem

내가 먼저 9 점을 발견하고 그것들을 배열 : 여기

내가 달성하기 위해 노력하고 있습니다 무엇의 이미지입니다. 각 가장자리에 검은 색 막대를 찾습니다. 상단에서 볼 수 있듯이, 파란색 코너 모서리, 녹색 중간 모서리에서 노랑색 바 중앙까지는 90 °입니다. 그러나 카메라 각도가 있으므로 각도가 더 이상 90 °가 아닙니다. 또한 두 각도가 180 °인지를 확인할 수 없기 때문에 잘못된 반응을 보입니다.

  1. 가장자리를 회전하는 4 점 및 3D로 중앙 점 (좌표)와 센터
  2. 가장자리 감지 (3 점)
  3. SolvePnP 감지 : 그래서 나는 다음과 같은 단계를 수행하고 싶어 위치는

이제 내가 사람들의 2 차원 좌표를 변환하는 방법을 궁금해 (모두 90 °가 있는지 확인) 각도를 측정 3D를 가리 킵니다. 거리를 신경 쓰지 않아도됩니다. 거리를 측정 할 수 있다면 다른 사람들 (1.4 배 거리 중간 가장자리 등)을 기준으로 계산하는 것만으로도 좋을 것입니다. 더 나은 결과를 줄 것입니다.

solvePnP를 ​​사용하면 순환 행렬로 바꿀 수있는 rvec를 얻을 수 있습니다 (Rodrigues()와 함께). 각도를 측정하려면 solvePnP에서 변환 (tvec)을 적용 할 필요가 없다는 점을 이해합니다.

iPhone을 사용할 때 모션 감지의 각도를 사용하여 회전 매트릭스를 미리 작성하고 타일을 회전하여 위로부터 보이게 할 수 없습니까? 나는 이것이 각각의 타일에 대해 (최대 약 100 개의 타일이있을 수 있음) 해결할 필요가없는 많은 CPU 시간을 절약 할 것이라고 생각한다.

찾기 호모 그래피

vector<Point2f> tileDots; 
tileDots.push_back(corner1); 
tileDots.push_back(edgeMiddle); 
tileDots.push_back(corner2); 
tileDots.push_back(middle.Dot->ellipse.center); 

vector<Point2f> realLivePos; 
realLivePos.push_back(Point2f(5.5,19.44)); 
realLivePos.push_back(Point2f(12.53,19.44)); 
realLivePos.push_back(Point2f(19.56,19.44)); 
realLivePos.push_back(Point2f(12.53,12.19)); 

Mat M = findHomography(tileDots, realLivePos, CV_RANSAC); 

cout << "M = "<< endl << " " << M << endl << endl; 

vector<Point2f> barPerspective; 
barPerspective.push_back(corner1); 
barPerspective.push_back(edgeMiddle); 
barPerspective.push_back(corner2); 
barPerspective.push_back(middle.Dot->ellipse.center); 
barPerspective.push_back(possibleBar.center); 
vector<Point2f> barTransformed; 

if (countNonZero(M) < 1) 
{ 
    cout << "No Homography found" << endl; 
} else { 
    perspectiveTransform(barPerspective, barTransformed, M); 
} 

이 그러나 나에게 잘못된 값을 제공하고, 내가보고 어디에 더 이상 모르는 (Sehe 서재 월드 보르 lauter Bäumen nicht mehr).

Image Coordinates https://i.stack.imgur.com/c67EH.png 
World Coordinates https://i.stack.imgur.com/Im6M8.png 
Points to Transform https://i.stack.imgur.com/hHjBM.png 
Transformed Points https://i.stack.imgur.com/P6lLS.png 

내가 4 개의 이미지를 게시하는 데 너무 바보가 보인다.

네 번째 색인 항목은 x 2007 y 717이어야합니다. 내가 잘못하고있는 것을 알지 못합니다.

업데이트 3 : 나는 내가 필요 정확히 무엇을하고있는 다음 포스트 Computing x,y coordinate (3D) from image point을 발견했다. 어쩌면 더 빠른 방법이 있을지 모르지만, 그렇지 않으면 찾을 수 없습니다.현재 수표를 사용할 수 있지만 알고리즘이 충분히 견고하면 테스트를 수행해야합니다.

Result with SolvePnP to find bar Center

+0

타일 5가 이미지에 있고 다른 모든 공간을 타일 5와 같은 평면에있는 경우, 필요한 모든 것을 갖추고 있습니다. opencv의 solvePnP 함수를 사용하여 카메라 위치/회전을 결정하고 평면 좌표를 사용하여 해당 평면에서 다른 객체의 위치를 ​​측정합니다. 타일 ​​5의 정확한 크기를 아는 경우 더 좋을 수도 있습니다. – Micka

+0

예. 다른 타일이 동일한 평면에 있지만, 카메라에서 "5"타일까지의 거리를 알 필요가 없으므로 올바른 x, y를 제공 할 수 있습니다. , z 좌표? 아니면 0,0,0 점 중 하나를 제공합니까? – Maverick2805

+0

타일 (또는 선택한 다른 참조 오브젝트)은 고정되어 있어야하거나 좌표계를 고정하려면 카메라가 정적이어야합니다. – Micka

답변

0

매트릭스는 |에 의해-정의, 당신이 그것을 반전 할 수 있도록 [R t는, 사각형이. 그러나이 행렬은 (n + 1) st 요소로 '1'이 추가 된 R^n (유클리드 공간)의 확장 일 뿐인 사영 공간에 있습니다. 호환성 문제의 경우, 투영 공간의 벡터와 곱하는 행렬의 오른쪽 아래 모서리에 '1'이 추가됩니다. 즉 : R은 귀하의 경우에는

[R|0] 
[0|1] 

된다 [R이 | t]는

[R|t] 
[0|1] 

이되고 는 '이 어디

[R'|-Rt] 
[0 | 1 ] 

대로 읽는 그 역을 취할 수 바꾸어 놓다. 필요한 부분이 맨 위 줄입니다.

전화가 3D 공간에서 변환되므로 픽셀 거리가 고려되어야합니다. 즉, mm/인치 단위로 거리를 필요로하는지 여부에 대한 질문에 대한 대답은 '예'입니다. 깊이에 대한 카메라 변환의 비율이 매우 작다고 가정 할 수있는 경우에만 답변이 변경되며 이는 약한 원근감 카메라이라고합니다. 당신이 다루려고하는 질문은 쉬운 것이 아닙니다. 아직 PhD 학위를 받고있는 사람들이 있습니다.

+0

나는 이것을 풀려고했지만, 더할 나위없이 미친 숫자를 얻고있다. rvec = [-0.6460095212173805; 2.037458031110235; -1.796950744317753] 회전 행렬 결과 : Rodrigues rotation Matrix = [-0.8358446378210687, -0.1072498757737782, 0.5383875978997618; -0.5475693554041162, 0.0929663142410786, -0.8315798611310578; 0.03913492619243286, -0.9898761177859267, -0.1364321406010136]. R을 조옮김하고 -R에 t를 곱한 다음 원래 좌표 (2009 | 871 | 1 | 1)로 곱하면 -14'201 | 18657을 얻게됩니다. – Maverick2805