내 학부 논문의 경우 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 °인지를 확인할 수 없기 때문에 잘못된 반응을 보입니다.- 는
- 가장자리를 회전하는 4 점 및 3D로 중앙 점 (좌표)와 센터
- 가장자리 감지 (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
타일 5가 이미지에 있고 다른 모든 공간을 타일 5와 같은 평면에있는 경우, 필요한 모든 것을 갖추고 있습니다. opencv의 solvePnP 함수를 사용하여 카메라 위치/회전을 결정하고 평면 좌표를 사용하여 해당 평면에서 다른 객체의 위치를 측정합니다. 타일 5의 정확한 크기를 아는 경우 더 좋을 수도 있습니다. – Micka
예. 다른 타일이 동일한 평면에 있지만, 카메라에서 "5"타일까지의 거리를 알 필요가 없으므로 올바른 x, y를 제공 할 수 있습니다. , z 좌표? 아니면 0,0,0 점 중 하나를 제공합니까? – Maverick2805
타일 (또는 선택한 다른 참조 오브젝트)은 고정되어 있어야하거나 좌표계를 고정하려면 카메라가 정적이어야합니다. – Micka