sanchez

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

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

  • Посещение

Репутация

0 Новичек

О sanchez

  • Звание
    Новичок
  1. Простите за мою откровенную тупость(первый раз сталкиваюсь с opencv), просто я никак не могу разобраться с этим примером, и уж тем более как его применить к моей работе. если поможете, буду очень благодарен
  2. если вам не сложно, не могли бы помочь с кодом, или поподробней рассказать что с этим stitching надо делать
  3. учёл ваши замечания, теперь компилируется без ошибок, но данный способ не помог выравнять яркость #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; } это я что-то неправильно сделал, или же метод просто не подходит?
  4. попробовал сделать по вашему совету: 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. но как это исправить?
  5. спасибо, попробую) возможно чуть позже появятся вопросы
  6. Помогите, пожалуйста, с кодом. При склейке двух изображений получается вот это: Как можно отредактировать конечное изображение или сначала сравнять два изображения к одной яркости? #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; }