วิธีแปลง CV_8UC1 เป็นประเภท int ปกติ

ฉันมีปัญหาในการทำความเข้าใจประเภท opencv ฉันมีเมทริกซ์ในประเภท CV_8UC1 แต่ฉันจะอ่านค่าขององค์ประกอบในเมทริกซ์ได้อย่างไร

ฉันรู้ว่าต้องใช้ at method แล้วจึง pa <here> ประเภทของฉัน แต่ CV_8UC1 เป็นประเภทใด 8 ช่องเดียวบิตที่ไม่ได้ลงชื่อไม่ได้บอกอะไรมาก

ฉันสามารถทำสิ่งนี้ได้ไหม: unsigned int a = mat->at(0,0);


person Jaykop    schedule 17.07.2011    source แหล่งที่มา
comment
CV_8UC1 คือ unsigned char เพียงแค่โยนมัน   -  person B. Decoster    schedule 20.07.2011


คำตอบ (2)


จากคู่มืออ้างอิง OpenCV :

CV_8UC1 – unsigned 8-bit single-channel data; can be used for grayscale image or binary image – mask.

ดังนั้นจึงเป็นเพียงช่องสัญญาณเดียวขนาด 8 บิตที่มีค่า 0..255

person Paul R    schedule 17.07.2011
comment
ใช่ ฉันรู้ แต่ฉันจะนำค่านั้นระหว่าง 0 ถึง 255 มาเป็น int ปกติได้อย่างไร เพราะเมื่อฉันชอบด้านบน ฉันได้ตัวเลขแปลกๆ เช่น 30044234 - person Jaykop; 17.07.2011
comment
คุณอาจต้องการแก้ไขคำถามของคุณเพื่อสะท้อนถึงสิ่งที่คุณ จริงๆ ถาม เพราะชื่อบอกว่า: CV_8UC1 ประเภทใดใน opencv คืออะไร ซึ่งหมายความว่าคุณ ไม่ รู้ว่า CV_8UC1 หมายถึงอะไร - person Paul R; 17.07.2011

นี่เป็นตัวอย่างบางส่วน:

  • ป.ล. บางครั้ง stackoverflow ไม่อนุญาตให้ใช้ >‹ ตัวอักษร ดังนั้นฉันจะใช้ } และ { แทน

.

// Char single channel matrix
Mat M1 = mat::ones(3,5,CV_8UC1);
int Val = M1{unsigned char}.at(2,3);

// int 16 matrix with 3 channels (like RGB pixel)
Mat M2 = mat::ones(3,5,CV_16UC(3));
__int16* Pix = &M2.at<__int16>(2,3);
Val = Pix[0] + Pix[1] + Pix[2];

// Example of how to find the size of each element in matrix
switch ( (M.dataend-M.datastart) / (M.cols*M.rows*M.channels())){
case sizeof(char):
     printf("This matrix has 8 bit depth\n");
     break;
case sizeof(double):
     printf("This matrix has 64 bit depth\n");
     break;
}

//Example of how to build dynamically a Matrix with desired depth
int inline CV_BUILD_MATRIX_TYPE(int elementSize, int nChannels){
    // Determine type of the matrix 
    switch (elementSize){
    case sizeof(char):
         return CV_8UC(nChannels);
         break;
    case (2*sizeof(char)):
         return CV_16UC(nChannels);
         break;
    case sizeof(float):
         return CV_32FC(nChannels);
         break;
    case sizeof(double):
         return CV_64FC(nChannels);
         break;
    }
    return -1;
}

Mat M = Mat::zeros(2,3,CV_BUILD_MATRIX_TYPE(4,2)); 
// builds matrix with 2 channels where each channel has depth of 4 bytes (float or __int32). As you wish
person DanielHsH    schedule 17.07.2011