簡體   English   中英

訪問負像素值OpenCV

[英]Accessing negative pixel values OpenCV

我正在嘗試在OpenCV中對圖像執行零交叉邊緣檢測。 我模糊並使用cvLaplace()然后從(0,max)縮放它。 我的問題是:如何以正確識別負值的方式訪問該圖像中的像素值? 使用OpenCV(cvPtr2D)提供的功能將返回未簽名的字符。 有什么想法或意見嗎?

謝謝

像素在內部存儲為IPL_DEPTH_8U,表示8位無符號字符,范圍從0到255。但是您也可以將它們打包為IPL_DEPTH_16S(有符號整數),甚至打包為IPL_DEPTH_32F(單精度浮點數)。

cvConvertScale()可能會完成這項工作! 但是,如果要手動轉換: OpenCV需要將IPL_DEPTH_32S轉換為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] << " "; 
}

不要忘記投票並將此答案標記為接受,以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM