C/C++ uchar的一个有趣用法


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/51377490


图像处理中常常使用的一种数据类型uchar,一般它指的就是unsigned char,可以查到它的定义为:

typedef unsigned char uchar;

是一种8-bit无符号整形数据,范围为[0, 255](与之相对应的是schar,定义为typedef signed char schar,取值范围是[-128, 127]),与8-bit图像的灰度级[0, 255]一一对应,所以图像灰度操作的时候经常使用(十六进制的0xff对应于十进制的255)。

#define CHAR_BIT      8         /* number of bits in a char */
#define SCHAR_MIN   (-128)      /* minimum signed char value */
#define SCHAR_MAX     127       /* maximum signed char value */
#define UCHAR_MAX     0xff      /* maximum unsigned char value */

接下来说一说有趣的用法:

cout << int( (uchar)-1 ) << endl;

这句的结果会是什么呢?首先句代码是可以编译通过的,输出结果是255!

-1对应的有符号整形二进制为:11111111,获得方式如下:

//#include <bitset> 
...

    std::bitset<sizeof(signed char)*8> a(-1);
    cout << a << endl;

// print: 11111111

所以(uchar)-1可以视为是在进行与运算:

  1 1 1 1 1 1 1 1 // AND
  & & & & & & & &
  1 1 1 1 1 1 1 1

这里用&表示与运算吧,因此对应的二进制结果仍为11111111,也就是十进制的255

同理如果是(uchar)-2,对应的就是254~

此外,语句(uchar)~0(uchar)-1如出一辙:从左往右,依次进行位取反和位与运算:

~ 0 0 0 0 0 0 0 0 // NOT
  | | | | | | | |
  1 1 1 1 1 1 1 1 // AND
  & & & & & & & &
  1 1 1 1 1 1 1 1

因此,可得:

bool issame = (uchar)~0 == (uchar)-1;
cout << issame << endl;

// print: 1

转载于:https://www.cnblogs.com/hehehaha/p/6332133.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个基于C++和OpenCV库的实现示例,包括图片压缩和解压缩,并将压缩文件和解压缩文件保存到指定路径中。 ```c++ #include <iostream> #include <fstream> #include <vector> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; void encode(const Mat& src, vector<pair<int, int>>& output) { int rows = src.rows, cols = src.cols; for (int r = 0; r < rows; r++) { uchar* ptr = src.ptr<uchar>(r); int start = -1; for (int c = 0; c < cols; c++) { if (ptr[c] != 0) { if (start == -1) { start = c; } } else { if (start != -1) { output.push_back(make_pair(start, c - start)); start = -1; } } } if (start != -1) { output.push_back(make_pair(start, cols - start)); } } } void decode(Mat& dst, const vector<pair<int, int>>& input) { dst.setTo(0); for (auto p : input) { int start = p.first, count = p.second; for (int i = 0; i < count; i++) { dst.at<uchar>(p.first / dst.cols, start + i) = 255; } } } void compress(const string& filename, const Mat& src) { vector<pair<int, int>> output; encode(src, output); ofstream fout(filename, ios::binary); int rows = src.rows, cols = src.cols; fout.write(reinterpret_cast<const char*>(&rows), sizeof(rows)); fout.write(reinterpret_cast<const char*>(&cols), sizeof(cols)); int count = output.size(); fout.write(reinterpret_cast<const char*>(&count), sizeof(count)); fout.write(reinterpret_cast<const char*>(output.data()), count * sizeof(pair<int, int>)); fout.close(); } void decompress(const string& filename, Mat& dst) { ifstream fin(filename, ios::binary); int rows, cols, count; fin.read(reinterpret_cast<char*>(&rows), sizeof(rows)); fin.read(reinterpret_cast<char*>(&cols), sizeof(cols)); fin.read(reinterpret_cast<char*>(&count), sizeof(count)); vector<pair<int, int>> input(count); fin.read(reinterpret_cast<char*>(input.data()), count * sizeof(pair<int, int>)); fin.close(); dst.create(rows, cols, CV_8U); decode(dst, input); } int main() { Mat src = imread("lena.jpg", IMREAD_GRAYSCALE); imshow("src", src); compress("lena.rle", src); Mat dst; decompress("lena.rle", dst); imshow("dst", dst); imwrite("lena_decoded.jpg", dst); waitKey(); return 0; } ``` 这个实现中,我们定义了两个函数 `compress` 和 `decompress`,用于将输入的灰度图像进行压缩和解压缩。具体来说,压缩函数 `compress` 中,我们首先调用之前定义的行程编码函数 `encode` 将图像进行行程编码,然后将编码后的行程数据和图像的大小信息写入到输出文件中。解压缩函数 `decompress` 中,我们则是从输入文件中读取图像的大小信息和行程数据,并调用之前定义的行程解码函数 `decode` 将其解码为一张灰度图像。 最后,我们在 `main` 函数中加载了一张灰度图像 `lena.jpg`,并将其进行了压缩和解压缩。我们可以将解压缩后的结果显示出来,以验证解压缩的正确性,并将解压缩后的图像保存到 `lena_decoded.jpg` 文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值