2011-11-21 40 views
7

Tôi cần phát hiện Mặt trời từ bầu trời không gian.Làm thế nào để phát hiện Mặt trời từ bầu trời không gian trong OpenCv?

Đây là những ví dụ về những hình ảnh đầu vào:

Tôi đã có kết quả như sau hình thái lọc (open hoạt động cho hai lần)

Dưới đây là mã thuật toán của quá trình xử lý này:

// Color to Gray 
cvCvtColor(image, gray, CV_RGB2GRAY); 

// color threshold 
cvThreshold(gray,gray,150,255,CV_THRESH_BINARY); 

// Morphologic open for 2 times 
cvMorphologyEx(gray, dst, NULL, CV_SHAPE_RECT, CV_MOP_OPEN, 2); 

Quá trình xử lý quá nặng đối với một tác vụ đơn giản như vậy không? Và làm thế nào để tìm trung tâm của Mặt trời? Nếu tôi tìm thấy các điểm trắng, hơn là tôi sẽ tìm thấy các điểm trắng của Trái đất lớn (góc trên bên trái trên hình ảnh ví dụ đầu tiên)

Vui lòng cho tôi biết thêm về hành động tiếp theo của tôi để phát hiện Mặt trời.

UPDATE 1:

Cố thuật toán nhận centroid bởi công thức: {x,y} = {M10/M00, M01/M00}

CvMoments moments; 
cvMoments(dst, &moments, 1); 
double m00, m10, m01; 

m00 = cvGetSpatialMoment(&moments, 0,0); 
m10 = cvGetSpatialMoment(&moments, 1,0); 
m01 = cvGetSpatialMoment(&moments, 0,1); 

// calculating centroid 
float centroid_x = m10/m00; 
float centroid_y = m01/m00; 

    cvCircle(image, 
       cvPoint(cvRound(centroid_x), cvRound(centroid_y)), 
       50, CV_RGB(125,125,0), 4, 8,0); 

Và nơi Trái đất là trong bức ảnh, tôi nhận được một kết quả như vậy:

Vì vậy, , centroid là trên trái đất. :(

UPDATE 2:

Cố cvHoughCircles:

CvMemStorage* storage = cvCreateMemStorage(0); 
CvSeq* circles = cvHoughCircles(dst, storage, CV_HOUGH_GRADIENT, 12, 
           dst->width/2, 255, 100, 0, 35); 

if (circles->total > 0) { 
    // getting first found circle 
    float* circle = (float*)cvGetSeqElem(circles, 0); 

    // Drawing: 
    // green center dot 
    cvCircle(image, cvPoint(cvRound(circle[0]),cvRound(circle[1])), 
      3, CV_RGB(0,255,0), -1, 8, 0); 
    // wrapping red circle 
    cvCircle(image, cvPoint(cvRound(circle[0]),cvRound(circle[1])), 
     cvRound(circle[2]), CV_RGB(255,0,0), 3, 8, 0); 
} 

Đầu dụ: bingo, nhưng thứ hai - không; (

tôi đã thử cấu hình khác nhau của cvHoughCircles() - không thể tìm thấy cấu hình để phù hợp với mọi ảnh mẫu của tôi.

UPDATE3:

matchTemplate phương pháp làm việc cho tôi (phản ứng của mevatron). Nó làm việc với số lượng lớn các bài kiểm tra.

Trả lời

8

Cách thử phương thức matchTemplate đơn giản. Tôi đã sử dụng mẫu hình ảnh này:
enter image description here

Và, nó phát hiện ra 3 trong số 3 của hình ảnh mặt trời Tôi cố gắng: enter image description hereenter image description hereenter image description here

này nên hoạt động do thực tế rằng vòng tròn (trong bạn trường hợp mặt trời) là bất biến luân phiên, và vì bạn ở xa mặt trời nên nó cũng là bất biến quy mô lớn. Vì vậy, mẫu phù hợp sẽ làm việc khá độc đáo ở đây.

Cuối cùng, đây là mã mà tôi sử dụng để làm điều này:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    /// Load image and template 
    string inputName = "sun2.png"; 
    string outputName = "sun2_detect.png"; 
    Mat img = imread(inputName, 1); 
    Mat templ = imread("sun_templ.png", 1); 

    /// Create the result matrix 
    int result_cols = img.cols - templ.cols + 1; 
    int result_rows = img.rows - templ.rows + 1; 

    Mat result(result_cols, result_rows, CV_32FC1); 

    /// Do the Matching and Normalize 
    matchTemplate(img, templ, result, CV_TM_CCOEFF); 
    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat()); 

    Point maxLoc; 
    minMaxLoc(result, NULL, NULL, NULL, &maxLoc); 

    rectangle(img, maxLoc, Point(maxLoc.x + templ.cols , maxLoc.y + templ.rows), Scalar(0, 255, 0), 2); 
    rectangle(result, maxLoc, Point(maxLoc.x + templ.cols , maxLoc.y + templ.rows), Scalar(0, 255, 0), 2); 

    imshow("img", img); 
    imshow("result", result); 

    imwrite(outputName, img); 

    waitKey(0); 

    return 0; 
} 

Hy vọng bạn thấy rằng hữu ích!

+2

Thực ra, những lý do này đang hoạt động khác với những điều được đề cập. Đối với bộ khởi động, không có gì giống với mẫu được sử dụng ở bất kỳ nơi nào khác trong những hình ảnh này. Ngoài ra, điều này có nhiều khả năng chậm hơn nhiều lần so với cách tiếp cận hình thái ban đầu. – mmgp

+1

Điểm tốt thực sự :) Tuy nhiên, vì tôi đã giả định tàu không gian trong hệ mặt trời của chúng tôi, tôi tin rằng chỉ có một mặt trời sẽ xuất hiện: D – mevatron

+0

Tôi đoán điều này sẽ thất bại nếu có bất kỳ phần nào của HUD (phi công giao diện người dùng) nằm trên đỉnh của mặt trời. Trừ khi khớp mẫu cho điểm số về kết quả phù hợp tốt như thế nào, theo cách đó bạn có thể đạt được kết quả hàng đầu và có thể nó sẽ hoạt động với một số vật cản. –

2

Màu Phân đoạn tiếp cận

Thực hiện Phân khúc màu sắc trên hình ảnh để xác định các đối tượng trên nền đen. Bạn có thể xác định mặt trời theo khu vực của nó (được xác định duy nhất nó, resp. Không thay đổi phần lớn hình ảnh). Cách tiếp cận tinh vi hơn có thể tính toán khoảnh khắc hình ảnh, ví dụ: hu khoảnh khắc của các đối tượng. Xem this page để biết các tính năng này.

Sử dụng thuật toán phân loại mà bạn chọn để phân loại thực tế các đối tượng được tìm thấy. Cách tiếp cận đơn giản nhất là tự xác định ngưỡng, resp. các phạm vi giá trị hóa ra hoạt động cho tất cả (hầu hết) các kết hợp đối tượng/hình ảnh của bạn.

Bạn có thể tính toán vị trí thực tế từ những khoảnh khắc thô, như for the circular sun the position is equal to the center of mass

Centroid: {x, y } = { M10/M00, M01/M00 } 

Cạnh Bản đồ tiếp cận

Một tùy chọn khác sẽ là một sự biến đổi vòng tròn hough của bản đồ cạnh, điều này sẽ hy vọng trở lại một số vòng tròn ứng cử viên (theo vị trí và bán kính). Bạn có thể chọn vòng tròn mặt trời theo bán kính bạn mong đợi (nếu bạn may mắn có tối đa một).

+0

Tôi nghĩ rằng với những khoảnh khắc hình ảnh, nó sẽ không hoạt động. Nếu chỉ có mặt trời trên màn hình - hơn, trung tâm của mặt trời là điểm 'Centroid'. Nhưng nếu Trái đất chiếm một phần màn hình (như trong hình 1 bên trái), thì phần này "nặng hơn" so với Sun và Centroid sẽ bị dịch chuyển. Tôi đã thử với CircleHough, và nó không hoạt động cho tất cả các hình ảnh ví dụ của tôi ... –

+0

Tôi đã cập nhật các câu hỏi của mình - ví dụ đã được thêm –

2

Một bổ sung đơn giản cho mã của bạn là lọc ra các đối tượng dựa trên kích thước của chúng. Nếu bạn luôn mong đợi trái đất lớn hơn nhiều so với mặt trời, hoặc mặt trời để có gần như cùng một khu vực trong mỗi bức ảnh, bạn có thể lọc nó theo khu vực.

Hãy thử Blob detector cho tác vụ này. Lưu ý rằng có thể tốt khi áp dụng hình mở/đóng hình thái thay vì xói mòn đơn giản hoặc giãn nở, vì vậy mặt trời của bạn sẽ có gần như cùng một khu vực trước và sau khi chế biến.

+0

thanx, tôi nghĩ rằng nó sẽ hữu ích cho tôi, nhưng xây dựng openCv của tôi không có phát hiện blob, và tôi mới làm quen trong C + + (tôi sẽ không thể biên dịch phiên bản mới nhất) –

+0

Lấy OpenCV mới nhất từ ​​sourceforge http://sourceforge.net/projects/opencvlibrary/ Và để sử dụng nó đơn giản như toán tử gia tăng :) Nó đã được biên dịch. Và .. bạn đã thêm bằng cách sử dụng không gian tên cv? Làm thế nào bạn không có máy dò đốm? – Sam

Các vấn đề liên quan