2015-04-16 39 views
0

我知道這個問題已經得到解答,但是當我嘗試解決方案時,它並沒有把我帶到任何地方。打印出來時奇怪的像素值?

下面給出的代碼是爲了得到圖像的左邊和右邊的邊界,用Canny邊緣檢測器OpenCV進行閾值處理。

#include<iostream> 
#include<vector> 
#include<math.h> 
#include<string> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 

using namespace cv; 
using namespace std; 

int main(int argc, char **argv) 
{ 
     int thresh = 100,rows = 0,cols = 0;; 
     Mat src,src_gray,canny_output; 
     src = imread(argv[1]); 
     cvtColor(src, src_gray, CV_BGR2GRAY); 
     blur(src_gray, src_gray, Size(3,3)); 
     Canny(src_gray, canny_output, thresh, thresh*3, 3); 

     Mat boundary_image = Mat::zeros(canny_output.size(), CV_8UC1); 
     rows = canny_output.rows; 
     cols = canny_output.cols; 

     cout<<rows<<endl<<cols<<endl; 

     for(int i=0;i<rows;i++) 
     { 
       for(int j=0;j<cols;j++) 
       { 
         cout<<canny_output.at<uchar>(i,j)<<endl; 
         if(canny_output.at<uchar>(i,j) == 255) 
         { 
           boundary_image.at<uchar>(i,j) = 255; 
           break; 
         } 
       } 
       for(int k = cols;k>0;k--) 
       { 
         if(canny_output.at<uchar>(i,k) == 255) 
         { 
           boundary_image.at<uchar>(i,k) = 255; 
           break; 
         } 
       } 
     } 
     imshow("boundary_image",boundary_image); 
     waitKey(0); 
     return 0; 
} 

該算法是否有效是次要的,但無法查看canny邊緣檢測圖像的值。它顯示了一些符號或空值。你能告訴我我要去哪裏嗎?

注:現在的問題是與打印語句

cout<<canny_output.at<uchar>(i,j)<<endl; 

這是不給我任何合理值在輸出查看像素值。發佈的類似問題,答案是使用uchar作爲數據類型,但在我的情況下,它不起作用。這聽起來可能很簡單,但非常感謝您的幫助。

+0

究竟是你想實現(即,什麼是理想的輸出)?柱子上的2個內圈不太清楚(至少對我來說)。 – sansuiso

+0

@sansuiso問題是我無法查看Canny邊緣檢測圖像的像素值。 「cout << canny_output.at (i,j)<< endl;」這一行沒有給出任何合理的像素值。 –

回答

2

要正確cout一個unsigned char/uchar,你應該首先將它轉換,例如,

cout << (int)canny_output.at<uchar>(i,j) << endl; 

要看下去,看看Why "cout" works weird for "unsigned char"?

+0

非常感謝。這是否意味着,應該在if循環中進行相同的更改,同時進行比較? –

+0

@LakshmiNarayanan不,你不需要。在這種情況下,它將輸入「int」。 – herohuyongtao

+0

是的,但是會爲新圖像設置值嗎? boundary_images?因爲我嘗試過,但圖像總是顯示爲空。有什麼線索嗎? –