opencv.js image alignment using rectangles

267 views Asked by At

I need to align an image (img1) based on a reference image (img2) so i used this part of code to extract keypoints and descriptors by ORB AKAZE method:

    let im1 = cv.imread(cvs_resized);
    let im1Gray = new cv.Mat();
    cv.cvtColor(im1, im1Gray, cv.COLOR_BGRA2GRAY);
    let descriptors1 = new cv.Mat();
    let keypoints1 = new cv.KeyPointVector();
    
    orb = new cv.AKAZE();
    orb.detectAndCompute(im2Gray, new cv.Mat(), keypoints2, descriptors2);
    orb.detectAndCompute(im1Gray, new cv.Mat(), keypoints1, descriptors1);
    //console.log(keypoints1,descriptors1);
    
    let good_matches = new cv.DMatchVector();
    let bf = new cv.BFMatcher();
    let matches = new cv.DMatchVectorVector();
    bf.knnMatch(descriptors1, descriptors2, matches, 2);
    let knnDistance_option=1;
    let counter = 0;
    for (let i = 0; i < matches.size(); ++i) {
    let match = matches.get(i);
    let dMatch1 = match.get(0);
    let dMatch2 = match.get(1);
    //console.log("[", i, "] ", "dMatch1: ", dMatch1, "dMatch2: ", dMatch2);
    if (dMatch1.distance <= dMatch2.distance * parseFloat(knnDistance_option)) {
        //console.log("***Good Match***", "dMatch1.distance: ", dMatch1.distance, "was less 
   than or = to: ", "dMatch2.distance * parseFloat(knnDistance_option)", dMatch2.distance * parseFloat(knnDistance_option), "dMatch2.distance: ", dMatch2.distance, "knnDistance", knnDistance_option);
        good_matches.push_back(dMatch1);
        counter++;
    }
}

let imMatches = new cv.Mat();
let color = new cv.Scalar(0,255,0, 255);
cv.drawMatches(im1, keypoints1, im2, keypoints2, 
                  good_matches, imMatches, color);
cv.imshow('image_B_final_result1', imMatches);
//cv.drawKeypoints(im1Gray, keypoints1, keypoints1_img, keypointcolor);
//cv.drawKeypoints(im2Gray, keypoints2, keypoints2_img, keypointcolor);

let points1 = [];
let points2 = [];
for (let i = 0; i < good_matches.size(); i++) {
    points1.push(keypoints1.get(good_matches.get(i).queryIdx ).pt.x );
    points1.push(keypoints1.get(good_matches.get(i).queryIdx ).pt.y );
    points2.push(keypoints2.get(good_matches.get(i).trainIdx ).pt.x );
    points2.push(keypoints2.get(good_matches.get(i).trainIdx ).pt.y );
}

let mat1 = new cv.Mat(points1.length,1,cv.CV_32FC2);
mat1.data32F.set(points1);
let mat2 = new cv.Mat(points2.length,1,cv.CV_32FC2);
mat2.data32F.set(points2);

let h_ = cv.findHomography(mat1, mat2, cv.RANSAC);
console.log('here');
let image_B_final_result = new cv.Mat();
cv.warpPerspective(im1, image_B_final_result, h_, im2.size());
console.log(image_B_final_result);
 

But this feature extraction is not working good for me. Since i have some good rectangle shapes in both images, i decided to use rectangle extraction as follows :

let im1_b = cv.Mat.zeros(im1.cols, im1.rows, cv.CV_8UC3);
cv.threshold(im1Gray, im1_b, 120, 200, cv.THRESH_BINARY); 
let contours = new cv.MatVector();
let hierarchy = new cv.Mat();
let poly = new cv.MatVector();
// You can try more different parameters
cv.findContours(im1_b, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE);
// draw contours with random Scalar
for (let i = 0; i < contours.size(); ++i) {
    let color = new cv.Scalar(255, 0, 0);
            var cnt_ = contours.get(i);
// You can try more different parameters
var perimeter = cv.arcLength(cnt_, true);
//console.log( perimeter);
    var arc_tr  =40;              
if(perimeter > arc_tr && perimeter < 4*arc_tr ){
     //cv.drawContours(dst, contours, i, color, 1, cv.LINE_8, hierarchy, 100);
    var rect = cv.boundingRect(cnt_); 
    
    var point1 = new cv.Point(rect.x, rect.y);
var point2 = new cv.Point(rect.x + rect.width, rect.y + rect.height);
cv.rectangle(im1, point1, point2, color, 1, cv.LINE_AA, 0);

var X = rect.x + rect.width/2;
var Y = rect.y + rect.height/2;
 
cv.imshow('image_B_final_result1', im1);
    
}                 
   
    
}

Now , the question is : How can i use rectangle positions as keypoints and descriptors to use them for aligning image. Thanks in advance.

0

There are 0 answers