2010-07-20 139 views
2

我正試圖對OpenCV中的圖像執行過零邊緣檢測。我模糊並使用cvLaplace(),然後從(0,最大)縮放它。我的問題是:如何以正確識別負值的方式訪問該圖像中的像素值?使用OpenCV提供的函數(cvPtr2D)將返回無符號字符。任何想法或意見?訪問負像素值OpenCV

謝謝

回答

7

像素在內部存儲爲IPL_DEPTH_8U,這意味着8位無符號的字符,範圍從0到255,但你也可以收拾他們爲IPL_DEPTH_16S(符號整數),甚至IPL_DEPTH_32F(單精度浮點點數)。

cvConvertScale()可能會完成這項工作!但是,如果你想將它手動轉換: OpenCV need to convert IPL_DEPTH_32S to IPL_DEPTH_32F

基本的想法是創建cvCreateImage(),你需要他們,然後用cvConvertScale()到原始數據複製到新格式的新圖像和格式。最後,你的代碼可能看起來像這樣:

IplImage* img = cvLoadImage("file.png", CV_LOAD_IMAGE_ UNCHANGED); 
// then retrieve size of loaded image to create the new one 

IplImage* new_img = cvCreateImage(img_size, IPL_DEPTH_16S, 1); 

cvConvertScale(img, new_img, 1/255.0, -128); 

我認爲這回答了線程的問題。

回答您的意見,您可以訪問這樣的像素信息:

IplImage* pRGBImg = cvLoadImage(input_file.c_str(), CV_LOAD_IMAGE_UNCHANGED); 
int width = pRGBImg->width; 
int height = pRGBImg->height; 
int bpp = pRGBImg->nChannels; 
for (int i=0; i < width*height*bpp; i+=bpp) 
{ 
    if (!(i % (width*bpp))) // print empty line for better readability 
     std::cout << std::endl; 

    std::cout << std::dec << "R:" << (int) pRGBImg->imageData[i] << 
          " G:" << (int) pRGBImg->imageData[i+1] << 
          " B:" << (int) pRGBImg->imageData[i+2] << " "; 
} 

不要忘記投票併爲它做的情況下接受了紀念這個答案。

+0

謝謝你的迴應!任何想法如何訪問這些像素,而不使用cvPtr2D()?我嘗試使用(float *)(new_img-> imageData + x * new_img-> widthStep + y)手動訪問它們,其中x - > new_img-> height和y - > width。但沒有取得成功。 – bluth 2010-07-22 16:59:23

+0

我編輯了我的答案,以便能夠添加代碼並回答您的評論。不要忘了投票,如果它幫助你。 =) – karlphillip 2010-07-22 19:10:00