2011-01-20 61 views
12

Hi Tôi muốn sử dụng opencv để cho tôi biết giá trị pixel của một hình ảnh trống và trắng do đó sản lượng sẽ trông như thế nàytruy cập Pixel trong OpenCV 2.2

10001 
00040 
11110 
00100 

Đây là mã hiện tại của tôi nhưng tôi không chắc chắn cách truy cập kết quả cuộc gọi CV_GET_CURRENT .. bất kỳ trợ giúp nào?

IplImage readpix(IplImage* m_image) { 


    cout << "Image width : " << m_image->width << "\n"; 
    cout << "Image height : " << m_image->height << "\n"; 
    cout << "-----------------------------------------\n"; 


    CvPixelPosition8u position; 

    CV_INIT_PIXEL_POS(position, (unsigned char*)(m_image->imageData), m_image->widthStep, cvSize(m_image->width, m_image->height), 0, 0, m_image->origin); 

    for(int y = 0; y < m_image->height; ++y) // FOR EACH ROW 
    { 
    for(int x = 0; x < m_image->width; ++x) // FOR EACH COL 
     { 
     CV_MOVE_TO(position, x, y, 1); 
     unsigned char colour = *CV_GET_CURRENT(position, 1); 

// I want print 1 for a black pixel or 0 for a white pixel 
// so i want goes here 


     } 

    cout << " \n"; //END OF ROW 

    } 
} 

Trả lời

23

Trong opencv 2.2, tôi muốn sử dụng giao diện C++.

cv::Mat in = /* your image goes here, 
       assuming single-channel image with 8bits per pixel */ 
for(int row = 0; row < in.rows; ++row) { 
    unsigned char* inp = in.ptr<unsigned char>(row); 
    for (int col = 0; col < in.cols; ++col) { 
     if (*inp++ == 0) { 
      std::cout << '1'; 
     } else { 
      std::cout << '0'; 
     } 
     std::cout << std::endl; 
    } 
} 
+0

Có thể thực hiện tương tự bằng IplImage. ?? Nếu vậy, bạn có thể vui lòng ném một số ánh sáng trên .. – Frankenstein

+0

@Frankenstein Andrews câu trả lời cho thấy một cách để truy cập pixel với IplImage. – etarion

2

Cấu trúc IplImage có biến là char* imageData - nó chỉ là bộ đệm của tất cả các pixel. Để đọc nó đúng cách, bạn phải biết định dạng hình ảnh của bạn. Ví dụ cho hình ảnh RGB888 3 ký tự đầu tiên trong mảng imageData sẽ đại diện cho giá trị r, g, b của pixel đầu tiên ở hàng đầu tiên. Nếu bạn biết định dạng hình ảnh - bạn có thể đọc dữ liệu đúng cách. định dạng hình ảnh có thể được phục hồi đọc một giá trị của cấu trúc IplImage:

http://opencv.willowgarage.com/documentation/basic_structures.html

Ngoài ra tôi nghĩ đó là hiệu quả hơn để viết vòng lặp như thế này:

uchar r,g,b; 

for (int y = 0; y < cvFrame->height; y++) 
{ 
    uchar *ptr = (uchar*) (cvFrame_->imageData + y*cvFrame_->widthStep); 
    for (int x = 0; x < cvFrame_->width; x++) 
    {  
     r = ptr[3*x]; 
     g = ptr[3*x + 1]; 
     b = ptr[3*x + 2]; 
    } 
} 

Mã này là dành cho RGB888 ảnh

+0

Các liên kết được chia –

2

IplImage là định dạng cũ cho hình ảnh. Bạn nên sử dụng định dạng mới, CvMat, có thể lưu trữ các ma trận tùy ý. Một hình ảnh chỉ là một ma trận, sau khi tất cả.

Sau đó, bạn có thể truy cập pixel bằng hàm cvGet2D, trả về CvScalar.

+0

Cảm ơn Tôi vừa mới thấy rằng trong 2.1 tài liệu cho Mat, tôi sẽ thay đổi để mà ,,, – macarthy

+0

Trên thực tế carnieri, là có bất kỳ cơ hội bạn có thể chỉ cho tôi cách thực hiện của nó sử dụng Mat, có vẻ như đã thay đổi rất nhiều kể từ phiên bản 1. * – macarthy

+0

phiên bản cvMat trong http://stackoverflow.com/questions/1824787/opencv-multi-channel-elemnt-access –

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