2012-01-18 33 views
9

Tôi đang thực hiện một số công việc phát hiện bằng cách sử dụng OpenCV và tôi cần sử dụng phép biến đổi khoảng cách. Ngoại trừ chức năng biến đổi khoảng cách trong opencv mang lại cho tôi một hình ảnh chính xác giống như hình ảnh tôi sử dụng làm nguồn. Có ai biết tôi đang làm gì sai không? Dưới đây là phần mã của tôi:Biến đổi khoảng cách OpenCV xuất ra một hình ảnh trông giống hệt hình ảnh đầu vào

cvSetData(depthImage, m_rgbWk, depthImage->widthStep); 

//gotten openCV image in "depthImage"   

IplImage *single_channel_depthImage = cvCreateImage(cvSize(320, 240), 8, 1); 
cvSplit(depthImage, single_channel_depthImage, NULL, NULL, NULL); 

//smoothing 
IplImage *smoothed_image = cvCreateImage(cvSize(320, 240), 8, 1); 
cvSmooth(single_channel_depthImage, smoothed_image, CV_MEDIAN, 9, 9, 0, 0); 

//do canny edge detector 
IplImage *edges_image = cvCreateImage(cvSize(320, 240), 8, 1); 
cvCanny(smoothed_image, edges_image, 100, 200); 

//invert values 
IplImage *inverted_edges_image = cvCreateImage(cvSize(320, 240), 8, 1); 
cvNot(edges_image, inverted_edges_image); 

//calculate the distance transform 
IplImage *distance_image = cvCreateImage(cvSize(320, 240), IPL_DEPTH_32F, 1); 
cvZero(distance_image); 

cvDistTransform(inverted_edges_image, distance_image, CV_DIST_L2, CV_DIST_MASK_PRECISE, NULL, NULL); 

Tóm lại, tôi grad hình ảnh từ Kinect, biến nó thành một hình ảnh một kênh, mịn nó, chạy các máy dò cạnh khôn ngoan, đảo ngược các giá trị, và sau đó Tôi làm biến đổi khoảng cách. Nhưng hình ảnh được chuyển đổi trông giống hệt như hình ảnh đầu vào. Chuyện gì vậy?

Cảm ơn!

+0

Tôi không nghĩ đó là một ý tưởng tốt để sử dụng một bộ lọc trung bình trước khi phát hiện cạnh: bộ lọc Gaussian sẽ tốt hơn vì nó doesn' t giới thiệu bất kỳ đồ tạo tác nào vv. – BIOStheZerg

Trả lời

20

Tôi tin rằng khóa ở đây là chúng trông giống như giống nhau. Dưới đây là một chương trình nhỏ tôi đã viết để thấy sự khác biệt:

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

using namespace std; 
using namespace cv; 

int main(int argc, char** argv) 
{ 
    Mat before = imread("qrcode.png", 0); 

    Mat dist; 
    distanceTransform(before, dist, CV_DIST_L2, 3); 

    imshow("before", before); 
    imshow("non-normalized", dist); 

    normalize(dist, dist, 0.0, 1.0, NORM_MINMAX); 
    imshow("normalized", dist); 
    waitKey(); 
    return 0; 
} 

Trong hình ảnh không bình thường, bạn thấy điều này:
enter image description here

mà không thực sự trông giống như nó thay đổi bất cứ điều gì, nhưng các bước khoảng cách rất nhỏ so với phạm vi tổng thể của các giá trị [0, 255] (do imshow chuyển đổi hình ảnh từ 32 bit sang 8 bit để hiển thị), chúng ta không thể thấy sự khác biệt, vì vậy hãy bình thường hóa nó. ..

Bây giờ chúng tôi nhận được điều này:
enter image description here

Các giá trị phải chính xác, nhưng khi được hiển thị, bạn sẽ cần phải bình thường hóa hình ảnh để thấy sự khác biệt.

EDIT: Đây là một mẫu 10x10 nhỏ từ góc trên bên trái của chương trình dist ma trận mà các giá trị là trên thực tế khác nhau:

[10.954346, 10.540054, 10.125763, 9.7114716, 9.2971802, 8.8828888, 8.4685974, 8.054306, 7.6400146, 7.6400146; 
    10.540054, 9.5850525, 9.1707611, 8.7564697, 8.3421783, 7.927887, 7.5135956, 7.0993042, 6.6850128, 6.6850128; 
    10.125763, 9.1707611, 8.2157593, 7.8014679, 7.3871765, 6.9728851, 6.5585938, 6.1443024, 5.730011, 5.730011; 
    9.7114716, 8.7564697, 7.8014679, 6.8464661, 6.4321747, 6.0178833, 5.6035919, 5.1893005, 4.7750092, 4.7750092; 
    9.2971802, 8.3421783, 7.3871765, 6.4321747, 5.4771729, 5.0628815, 4.6485901, 4.2342987, 3.8200073, 3.8200073; 
    8.8828888, 7.927887, 6.9728851, 6.0178833, 5.0628815, 4.1078796, 3.6935883, 3.2792969, 2.8650055, 2.8650055; 
    8.4685974, 7.5135956, 6.5585938, 5.6035919, 4.6485901, 3.6935883, 2.7385864, 2.324295, 1.9100037, 1.9100037; 
    8.054306, 7.0993042, 6.1443024, 5.1893005, 4.2342987, 3.2792969, 2.324295, 1.3692932, 0.95500183, 0.95500183; 
    7.6400146, 6.6850128, 5.730011, 4.7750092, 3.8200073, 2.8650055, 1.9100037, 0.95500183, 0, 0; 
    7.6400146, 6.6850128, 5.730011, 4.7750092, 3.8200073, 2.8650055, 1.9100037, 0.95500183, 0, 0] 
+0

Cảm ơn bạn cảm ơn bạn! –

+0

xin lỗi nhưng tôi đã cố gắng làm điều này một thời gian và tôi dường như không thể tìm ra. Làm thế nào để bạn lấy mẫu bạn vừa làm ở trên? Tôi tiếp tục cố gắng để in các giá trị trong pixel để màn hình bằng cách sử dụng printf nhưng tôi chỉ nhận được rác. Làm cách nào để in IPL_DEPTH_8U vào màn hình và IPL_DEPTH_32F để sàng lọc?Cảm ơn –

+0

đặt câu hỏi –

1

Bạn có thể in các giá trị này sử dụng mã này trước khi normalize function:

for(int x=0; x<10;x++) 
    { 
    cout<<endl; 
    for(int y=0; y<10;y++) 
     cout<<std::setw(10)<<dist.at<float>(x, y); 
    } 
3

Tôi vừa tìm ra điều này. Các OpenCV distanceTransform

Tính khoảng cách đến zero điểm ảnh gần nhất cho mỗi điểm ảnh của hình ảnh nguồn.

và do đó dự kiến ​​hình ảnh cạnh của bạn sẽ âm.

Tất cả bạn cần làm là để phủ nhận các cạnh hình ảnh của bạn:

edges = 255 - edges; 
+0

tại sao sử dụng 'cạnh = 255 - cạnh;' thay vì chỉ đơn giản là 'Không' (' bitwise_not')? – vaxquis

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