sanchez

Пользователи
  • Количество публикаций

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О sanchez

  • Звание
    Бывалый
  1. 1) наверняка очень глупый вопрос, но всё же: Ptr<RotationWarper> warper = warper_creator->create(static_cast<float>(warped_image_scale * seam_work_aspect)); for (int i = 0; i < num_images; ++i) { Mat_<float> K; cameras[i].K().convertTo(K, CV_32F); float swa = (float)seam_work_aspect; K(0,0) *= swa; K(0,2) *= swa; K(1,1) *= swa; K(1,2) *= swa; corners[i] = warper->warp(images[i], K, cameras[i].R, INTER_LINEAR, BORDER_REFLECT, images_warped[i]); sizes[i] = images_warped[i].size(); warper->warp(masks[i], K, cameras[i].R, INTER_NEAREST, BORDER_CONSTANT, masks_warped[i]); } Здесь последняя строка делаем warp и потом в конце(где последний for), там есть строка: mask.create(img_size, CV_8U); mask.setTo(Scalar::all(255)); warper->warp(mask, K, cameras[img_idx].R, INTER_NEAREST, BORDER_CONSTANT, mask_warped); так чем они отличаются, и зачем делать одно и тоже 2) там же есть corners. по идее это верхний левый угол изображения. но когда я вывожу в консоль их, там координаты: у одного изображения [-308, 1227] и у второго [-183, 1221]. так что это за углы? (не знаю важно это или нет, но размер изображений 640*480) 3) Ptr<SeamFinder> seam_finder; seam_finder = new detail::GraphCutSeamFinder(GraphCutSeamFinderBase::COST_COLOR); seam_finder->find(images_warped_f, corners, masks_warped); что делает seam_finder? если я правильно понял, то он находит швы, но как?
  2. спасибо. можете чуть пояснить по второму пункту: у камеры есть параметр focal - а что он значит(например параметр R отвечает за вращение)?
  3. Можете немного пояснить несколько пунктов по коду из stitching_detailed.cpp 1) Ptr<detail::BundleAdjusterBase> adjuster; if (ba_cost_func == "reproj") adjuster = new detail::BundleAdjusterReproj(); else if (ba_cost_func == "ray") adjuster = new detail::BundleAdjusterRay(); не могу понять что делают эти два метода(Ray и Reproj). 2) vector<double> focals; for (size_t i = 0; i < cameras.size(); ++i) { focals.push_back(cameras[i].focal); } sort(focals.begin(), focals.end()); float warped_image_scale; if (focals.size() % 2 == 1) warped_image_scale = static_cast<float>(focals[focals.size() / 2]); else warped_image_scale = static_cast<float>(focals[focals.size() / 2 - 1] + focals[focals.size() / 2]) * 0.5f; что обозначают warped_image_scale и focals? 3) dilate(masks_warped[img_idx], dilated_mask, Mat()); resize(dilated_mask, seam_mask, mask_warped.size()); mask_warped = seam_mask & mask_warped; что делает функция dilate? 4)и последнее, как выполняется blending(каким алгоритмом). поясню: переменная blend_type может принимать значения NO, FEATHER или MULTIBAND. мне интересно, как работают MULTIBAND и NO
  4. если не сложно, можно чуть поподробней как это сделать, а то с реализацией у меня большие проблемы. я понял только создание масок(и то не уверен об этом ли вы говорили) Mat mask1 = Mat::zeros(image1.rows, image1.cols, CV_32FC1); Mat mask2 = Mat::ones(image2.rows, image2.cols, CV_32FC1);
  5. а есть какой-то способ (без stiching), чтобы обработать изображения. Может как то обработать уже результирующее изображении? просто нужно, чтобы алгоритм(код) склейки оставался прежним(как я скидывал в самом начале)
  6. Простите за мою откровенную тупость(первый раз сталкиваюсь с opencv), просто я никак не могу разобраться с этим примером, и уж тем более как его применить к моей работе. если поможете, буду очень благодарен
  7. если вам не сложно, не могли бы помочь с кодом, или поподробней рассказать что с этим stitching надо делать
  8. учёл ваши замечания, теперь компилируется без ошибок, но данный способ не помог выравнять яркость #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv; using namespace std; int main() { // Load the images Mat image1 = imread("2.png"); Mat image2 = imread("1.png"); Mat image3; Mat image4; Mat gray_image1; Mat gray_image2; Mat gray_image3; Mat hsv1, hsv2; vector<Mat> channel1; vector<Mat> channel2; // конвертируем в HSV cvtColor(image1, hsv1, CV_BGR2HSV); split(hsv1, channel1); imshow("h channel", channel1[2]); cvtColor(image2, hsv2, CV_BGR2HSV); split(hsv2, channel2); imshow("h channel1", channel2[2]); double v1 = 0, v2 = 0; for (int i = 0; i<hsv1.rows; i++) { for (int j = 0; j<hsv1.cols; j++) { v1 += channel1[2].at<uchar>(i, j); } } for (int i = 0; i<hsv2.rows; i++) { for (int j = 0; j<hsv2.cols; j++) { v2 += channel2[2].at<uchar>(i, j); } } double v_average1 = 0, v_average2 = 0; v_average1 = v1 / (hsv1.rows * hsv1.cols); v_average2 = v2 / (hsv2.rows * hsv2.cols); double k1 = 0, k2 = 0; k1 = (v_average1 + v_average2) / (2 * v_average1); k2 = (v_average1 + v_average2) / (2 * v_average2); cout <<"v1 and v2: " << v1 << " " << v2 << endl; cout << "v_average1 and v_average2: " << v_average1 << " " << v_average2 << endl; cout << "k1 and k2: " << k1 << " " << k2 << endl; for (int i = 0; i<hsv1.rows; i++) { for (int j = 0; j<hsv1.cols; j++) { channel1[2].at<uchar>(i, j) = cv::saturate_cast<uchar>(k1 * channel1[2].at<uchar>(i, j)); } } for (int i = 0; i<hsv2.rows; i++) { for (int j = 0; j<hsv2.cols; j++) { channel2[2].at<uchar>(i, j) = cv::saturate_cast<uchar>(k2 * channel2[2].at<uchar>(i, j)); } } merge(channel1, image3); merge(channel2, image4); imshow("first image11", image3); imshow("first image12", image4); cvtColor(image3, image1, CV_HSV2BGR); cvtColor(image4, image2, CV_HSV2BGR); // Convert to Grayscale cvtColor(image1, gray_image1, CV_RGB2GRAY); cvtColor(image2, gray_image2, CV_RGB2GRAY); imshow("first image", image1); imshow("second image", image2); if (!gray_image1.data || !gray_image2.data) { std::cout << " Error reading images " << std::endl; return -1; } //-- Step 1: Detect the keypoints using SURF Detector int minHessian = 400; SurfFeatureDetector detector(minHessian); std::vector< KeyPoint > keypoints_object, keypoints_scene; detector.detect(gray_image1, keypoints_object); detector.detect(gray_image2, keypoints_scene); //-- Step 2: Calculate descriptors (feature vectors) SurfDescriptorExtractor extractor; Mat descriptors_object, descriptors_scene; extractor.compute(gray_image1, keypoints_object, descriptors_object); extractor.compute(gray_image2, keypoints_scene, descriptors_scene); //-- Step 3: Matching descriptor vectors using FLANN matcher FlannBasedMatcher matcher; std::vector< DMatch > matches; matcher.match(descriptors_object, descriptors_scene, matches); double min_dist = 100; //-- Quick calculation of min distances between keypoints for (int i = 0; i < descriptors_object.rows; i++) { double dist = matches[i].distance; if (dist < min_dist) min_dist = dist; } //-- Use only "good" matches (i.e. whose distance is less than 3*min_dist ) std::vector< DMatch > good_matches; for (int i = 0; i < descriptors_object.rows; i++) { if (matches[i].distance < 3 * min_dist) { good_matches.push_back(matches[i]); } } std::vector< Point2f > obj; std::vector< Point2f > scene; for (int i = 0; i < good_matches.size(); i++) { //-- Get the keypoints from the good matches obj.push_back(keypoints_object[good_matches[i].queryIdx].pt); scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt); } // Find the Homography Matrix Mat H = findHomography(obj, scene, CV_RANSAC); // Use the Homography Matrix to warp the images Mat result; warpPerspective(image1, result, H, Size(image1.cols + image2.cols, image1.rows)); Mat half(result, Rect(0, 0, image2.cols, image2.rows)); image2.copyTo(half); imshow("Result", result); waitKey(0); return 0; } это я что-то неправильно сделал, или же метод просто не подходит?
  9. попробовал сделать по вашему совету: Mat image3; Mat image4; Mat hsv1, hsv2; vector<Mat> channel1; vector<Mat> channel2; // конвертируем в HSV cvtColor(image1, hsv1, CV_RGB2HSV); split(hsv1, channel1); cvtColor(image2, hsv2, CV_RGB2HSV); split(hsv2, channel2); double v1 = 0, v2 = 0; for (int i = 0; i<hsv1.rows; i++) { for (int j = 0; j<hsv1.cols; j++) { v1 += channel1[2].at<uchar>(i, j); } } for (int i = 0; i<hsv2.rows; i++) { for (int j = 0; j<hsv2.cols; j++) { v2 += channel2[2].at<uchar>(i, j); } } double v_average1 = 0, v_average2 = 0; v_average1 = v1 / (hsv1.rows * hsv1.cols); v_average2 = v2 / (hsv2.rows * hsv2.cols); double k1 = 0, k2 = 0; k1 = (v_average1 + v_average2) / (2 * v_average1); k2 = (v_average1 + v_average2) / (2 * v_average2); cout <<"v1 and v2" << v1 << " " << v2 << endl; cout <<"v_average1 and v_average2" << v_average1 << " " << v_average2 << endl; cout <<"k1 and k2" << k1 << " " << k2 << endl; for (int i = 0; i<hsv1.rows; i++) { for (int j = 0; j<hsv1.cols; j++) { channel1[2].at<uchar>(i, j) *= k1; } } for (int i = 0; i<hsv2.rows; i++) { for (int j = 0; j<hsv2.cols; j++) { channel2[2].at<uchar>(i, j) *= k2; } } bitwise_and(channel1[0], channel1[1], image3); bitwise_and(image3, channel1[2], image3); bitwise_and(channel2[0], channel2[1], image4); bitwise_and(image4, channel2[2], image4); cvtColor(image3, image1, CV_HSV2RGB); cvtColor(image4, image2, CV_HSV2RGB); и вот результат выдаёт вот такие ошибки: я нашёл, что ошибка возникает из-за того, что я преобразую обратно из HSV. но как это исправить?
  10. спасибо, попробую) возможно чуть позже появятся вопросы
  11. Помогите, пожалуйста, с кодом. При склейке двух изображений получается вот это: Как можно отредактировать конечное изображение или сначала сравнять два изображения к одной яркости? #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv; int main() { // Load the images Mat image1 = imread("2.png"); Mat image2 = imread("1.png"); Mat image3; Mat gray_image1; Mat gray_image2; Mat gray_image3; // Convert to Grayscale cvtColor(image1, gray_image1, CV_RGB2GRAY); cvtColor(image2, gray_image2, CV_RGB2GRAY); imshow("first image", image1); imshow("second image", image2); if (!gray_image1.data || !gray_image2.data) { std::cout << " Error reading images " << std::endl; return -1; } //-- Step 1: Detect the keypoints using SURF Detector int minHessian = 400; SurfFeatureDetector detector(minHessian); std::vector< KeyPoint > keypoints_object, keypoints_scene; detector.detect(gray_image1, keypoints_object); detector.detect(gray_image2, keypoints_scene); //-- Step 2: Calculate descriptors (feature vectors) SurfDescriptorExtractor extractor; Mat descriptors_object, descriptors_scene; extractor.compute(gray_image1, keypoints_object, descriptors_object); extractor.compute(gray_image2, keypoints_scene, descriptors_scene); //-- Step 3: Matching descriptor vectors using FLANN matcher FlannBasedMatcher matcher; std::vector< DMatch > matches; matcher.match(descriptors_object, descriptors_scene, matches); double min_dist = 100; //-- Quick calculation of min distances between keypoints for (int i = 0; i < descriptors_object.rows; i++) { double dist = matches[i].distance; if (dist < min_dist) min_dist = dist; } //-- Use only "good" matches (i.e. whose distance is less than 3*min_dist ) std::vector< DMatch > good_matches; for (int i = 0; i < descriptors_object.rows; i++) { if (matches[i].distance < 3 * min_dist) { good_matches.push_back(matches[i]); } } std::vector< Point2f > obj; std::vector< Point2f > scene; for (int i = 0; i < good_matches.size(); i++) { //-- Get the keypoints from the good matches obj.push_back(keypoints_object[good_matches[i].queryIdx].pt); scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt); } // Find the Homography Matrix Mat H = findHomography(obj, scene, CV_RANSAC); // Use the Homography Matrix to warp the images Mat result; warpPerspective(image1, result, H, Size(image1.cols + image2.cols, image1.rows)); Mat half(result, Rect(0, 0, image2.cols, image2.rows)); image2.copyTo(half); imshow("Result", result); waitKey(0); return 0; }