私は論文に取り組んでいますが、3 日間連続してコードのエラーに悩まされています。神への愛のために、それを修正できないようです。
アイデアはシンプルです。3 つの黒いコーナーがあるマップがあります (QR コードとまったく同じです)。3 つの黒い角の中心座標と最後のポイントの座標 (ポイント D) を取得します。この領域をファイルに抽出して、マップが常に 0、90、180、270、360 度の角度を向くようにします。インターネットを検索したところ、RotatedRectangle に関する解決策が見つかりました。動作するコードは次のとおりです。
public static RotatedRect getRotatedRect(List<Point> orderedPointList, Point D){// here i have as parameters Points(in this order) Top Right and Bottom + the final calculated point(Point D);
if(orderedPointList==null)
return null;
RotatedRect rect = new RotatedRect();
Point Top = orderedPointList.get(0);
Point Right = orderedPointList.get(1);
Point Bottom = orderedPointList.get(2);
Point[] points= new Point[]{Top,Right,D,Bottom};
rect.points(points);
Point Center = new Point();
Center.x=(Bottom.x+Right.x)/2;
Center.y=(Bottom.y+Right.y)/2;
rect.center = Center;
double diference1=Top.x-Bottom.x;
double difference2=Top.y-Bottom.y;
double angle=Math.atan(diference1-difference2) * 180/Math.PI;// this formula is used to see how much the map is rotated untill now i haven't tested it for all degrees but as i see it returns -180 0 180.
rect.angle=angle;
double mapwidth=Math.sqrt((Right.x-Top.x)*(Right.x-Top.x)+(Right.y-Top.y)*(Right.y-Top.y));
double mapheight=Math.sqrt((Bottom.x-Top.x)*(Bottom.x-Top.x)+(Bottom.y-Top.y)*(Bottom.y-Top.y));
rect.size.width=mapwidth;
rect.size.height=mapheight; // here i set the RotatedRectangle width and height.
return rect;
}
ただし、次のコードは何をしても機能しません。
public static Mat getRotatedRectMat(Mat mImage,RotatedRect rect){
if(rect==null)
return null;
Mat M = new Mat();
Mat rotated = new Mat();
Mat clone=mImage.clone();
//clone.convertTo(clone, CvType.CV_32F);
//rotated.convertTo(rotated, CvType.CV_32F);
// perform the affine transformation
Rect boundingRect = rect.boundingRect();
if(boundingRect.x >= 0 && boundingRect.y >=0
&& (boundingRect.x+boundingRect.width) < clone.cols() &&
(boundingRect.y+boundingRect.height) < clone.rows() ){
Mat cropped=new Mat();
M = Imgproc.getRotationMatrix2D(rect.center, rect.angle, 0.5);
Imgproc.warpAffine(clone, rotated, M, clone.size(), Imgproc.INTER_AREA);
Imgproc.getRectSubPix(rotated, rect.size, rect.center, cropped);//CRASHES exactly right here
reason:Noone knows
return cropped;
}
e.message() を実行すると発生するエラーは次のとおりです: cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/samplers.cpp:556: error: ( -210) 関数内 void cvGetRectSubPix(void const, void, CvPoint2D32f)