2016-07-20 1 views
0

OpenCV에서 Mat2 이미지에 Point2f imagePoints를 쓰려고했습니다. 나는 아래의 링크를 따라 가고 있었다.벡터에서 매트 만들기 <point2f> 어설 션 오류 오류

Create Mat from vector<point2f>

는하지만 점점 오전 오류 '어설 션 실패'. 도와주세요.

코드 :

std::vector<cv::Point3d> objectPoints; 
std::vector<cv::Point2d> imagePoints; 

cv::Mat intrisicMat(3, 3, cv::DataType<double>::type); 
intrisicMat.at<double>(0, 0) = param.focalLength.first; 
intrisicMat.at<double>(0, 1) = 0; 
intrisicMat.at<double>(0, 2) = param.principalPoint.first; 

intrisicMat.at<double>(1, 0) = 0; 
intrisicMat.at<double>(1, 1) = param.focalLength.second; 
intrisicMat.at<double>(1, 2) = param.principalPoint.second; 

intrisicMat.at<double>(2, 0) = 0; 
intrisicMat.at<double>(2, 1) = 0; 
intrisicMat.at<double>(2, 2) = 1; 

cv::Mat rVec(3, 1, cv::DataType<double>::type); // Rotation vector 
rVec.at<double>(0) = 0; 
rVec.at<double>(1) = 0; 
rVec.at<double>(2) = 0; 

cv::Mat tVec(3, 1, cv::DataType<double>::type); // Translation vector 
tVec.at<double>(0) = 0; 
tVec.at<double>(1) = 0; 
tVec.at<double>(2) = 0; 

cv::Mat distCoeffs(5, 1, cv::DataType<double>::type); // Distortion vector 
distCoeffs.at<double>(0) = param.distortionRadial.at(0); 
distCoeffs.at<double>(1) = param.distortionRadial.at(1); 
distCoeffs.at<double>(2) = param.distortionTangential.first; 
distCoeffs.at<double>(3) = param.distortionTangential.second; 
distCoeffs.at<double>(4) = param.distortionRadial.at(2); 


projectPoints(objectPoints, rVec, tVec, intrisicMat, distCoeffs, imagePoints); 
Mat depthImage = Mat(imagePoints); 
imwrite("E:/softwares/1.8.0.71/bin/depthImage.jpg", depthImage); 
cout << "depthImage.channels()=" << depthImage.channels() << endl; 

오류 :

OpenCV Error: Assertion failed (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) in cv::imwrite_, file E:\softwares\opencv-3.1.0\opencv-3.1.0\modules\imgcodecs\src\loadsave.cpp, line 455 

내 이미지가이 개 채널을 가지고 있습니다. 그래서 ImWrite()가 어설 션 오류를 던지고 있습니다. 이렇게하지 않으면 이미지 포인트를 사용하여 매트 이미지를 어떻게 만들 수 있습니까?

+0

코드 및 전체 오류 로그를 보여주십시오. –

+0

OpenCV 오류 : 어설 션이 실패했습니다 (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) cv :: imwrite_ 파일 E : \ softwares \ opencv- 3.1.0 \ opencv-3.1.0 \ modules \ imgcodecs \ src \ loadsave.cpp, 줄 455 – MThomas

+0

이것은 내 코드입니다 .. projectPoints (objectPoints, rVec, tVec, intrisicMat, distCoeffs, imagePoints); 매트 포인트 매트 = 매트 (imagePoints); imwrite ("E : /softwares/1.8.0.71/bin/depthImage.png", pointsMat); – MThomas

답변

1

댓글에 작성한 내용으로는 Mat을 파일에 쓰려고합니다. 문제는 Vector<Point2f>Mat은 2 채널 매트릭스를 제공하며 이미지 형식 (회색 음영, RGB 또는 RGBA)과 호환되지 않습니다.

또한, (마크 다운을 사용하여) 코드를 표시하여 읽기 쉽도록 도와주십시오.

+0

그래서이 데이터를 사용하여 매트 이미지를 만들 수 있습니까? – MThomas

+0

이 2 채널 매트의 의미를 가르쳐 주시겠습니까? 이미지로 보여 주려고하는 것은 무엇입니까? 값을 직렬화 된 Mat 객체로 저장하려는 경우 XML 또는 YML 형식으로 저장하는 목적의 cv :: FileStorage 클래스가 있습니다 (http://docs.opencv.org/2.4/modules 참조). /core/doc/xml_yaml_persistence.html). – Cedric

+0

제 목표는 3D clod 포인트를 2D 이미지 데이터로 변환하는 것입니다. 나는 2D 심상을 구상하기 위하여 2D 심상을 저장하고 싶다. – MThomas