Tôi đang cố gắng đạt được hiệu ứng sau đây, được hiển thị ở đây bằng công cụ phối cảnh trong GIMP.Chuyển đổi hình ảnh OpenCV và thay đổi phối cảnh
ảnh gốc (620x466 pixel)
chuyển hình ảnh
gì tôi có là một webcam cố định và muốn cắm chuyển đổi trên ma trận con số, kết quả trong một hình thang undistorted đầu ra.
Tôi biết rằng có các tùy chọn khác có sẵn để undistort hình ảnh trong OpenCV, nhưng tôi thực sự muốn cung cấp số liệu ma trận biến đổi theo cách thủ công, trong khi kết thúc bằng hình thang có hình dạng.
Từ đọc xung quanh tôi có cảm giác warpPerspective
, findHomography
hoặc getPerspectiveTransform
có thể hữu ích, nhưng không chắc chắn làm thế nào để đi về điều này trong C++
Bất kỳ lời khuyên hữu ích sẽ được đánh giá rất nhiều.
Đã thử chạy với mã sau nhưng tôi chỉ nhận được một cửa sổ có hiển thị 1 pixel.
Có lẽ cách tôi đã chỉ định điểm bằng pixel, điều này có đúng không?
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <cv.h>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
cv::Mat OpenWarpPerspective(const cv::Mat& _image
, const cv::Point2f& _lu
, const cv::Point2f& _ru
, const cv::Point2f& _rd
, const cv::Point2f& _ld
, const cv::Point2f& _lu_result
, const cv::Point2f& _ru_result
, const cv::Point2f& _rd_result
, const cv::Point2f& _ld_result
, cv::Mat& _transform_matrix)
{
// todo do some checks on input.
cv::Point2f source_points[4];
cv::Point2f dest_points[4];
source_points[0] = _lu;
source_points[1] = _ru;
source_points[2] = _rd;
source_points[3] = _ld;
dest_points[0] = _lu_result;
dest_points[1] = _ru_result;
dest_points[2] = _rd_result;
dest_points[3] = _ld_result;
cv::Mat dst;
_transform_matrix = cv::getPerspectiveTransform(source_points, dest_points);
cv::warpPerspective(_image, dst, _transform_matrix, dst.size());
return dst;
}
int main(int argc, char** argv)
{
Mat image;
Mat edited;
image = imread("c:/org.png", CV_LOAD_IMAGE_COLOR); // Read the file
namedWindow("Display window", CV_WINDOW_AUTOSIZE);// Create a window for display.
Point2f one = (0.0, 0.0);
Point2f two = (317.0, 0.0);
Point2f three = (317.0, 240.0);
Point2f four = (0.0, 240.0);
Point2f five = (-100.0, 0.0);
Point2f six = (617.0, 0.0);
Point2f seven = (317.0, 240.0);
Point2f eight = (0.0, 240.0);
OpenWarpPerspective(image,one,two,three,four,five,six,seven,eight,edited);
imshow("Display window", edited); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
Cảm ơn bạn rất nhiều vì đã trả lời, sẽ kiểm tra điều này sau để xem những gì tôi nhận được – winterDream