色彩空间
RGB 和 BGR
opencv主要使用BGR,与其他显示设备RGB不同需注意,是产生颜色不对的原因所在。
opencv Mat的type()值参照表
- | C1 | C2 | 1C3 | C4 | C(5) | C(6) | C(7) | C(8) |
---|---|---|---|---|---|---|---|---|
CV_8U | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 |
CV_8S | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 |
CV_16U | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 |
CV_16S | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 |
CV_32S | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 |
CV_32F | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 |
CV_64F | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 |
HSV 和 HSL
HSV:H(Hue)表示色相,S(saturation)表示饱和度,V(value)明度
HSL:H(Hue)表示色相,S(saturation)表示饱和度,L(lightness)亮度
YUV
YUV:主要用于视频处理,数据源Y代表灰色图像,U、V代表颜色
YUV4:2:0 表示没4个Y里,要么有2个U,要么有2个V
划线
#include <iostream>
#include <vector>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/video.hpp>
#include <NumCpp.hpp>
cv::Mat array2Img(nc::NdArray<uchar> array);
void main(){
nc::NdArray<uchar> img_array = nc::NdArray<uchar>(40, 60);
img_array.zeros();
cv::Mat line_img;
int count = 0;
while (count < 30) {
img_array(count ,9) = 255; // blue
img_array(count, 10) = 255; // green
img_array(count, 11) = 255; // red
count += 1;
}
for (size_t i = 0; i < img_array.numRows(); i++)
{
std::cout << "第" << i << ": ";
for (size_t j = 0; j < img_array.numCols(); j++)
{
std::cout << (size_t)img_array(i, j);
}
std::cout << "\n";
}
line_img = array2Img(img_array);
cv::namedWindow("line_img", cv::WINDOW_NORMAL);
cv::imshow("line_img",line_img);
cv::waitKey(0);
}
//数组转图片
cv::Mat array2Img(nc::NdArray<uchar> array) {
size_t h = array.numRows();
size_t w = array.numCols();
cv::Mat img(h,(size_t)(w/3), CV_8UC3); //保存为RGB
for (size_t i = 0; i < h; i++)
{
uchar* tmp = img.ptr<uchar>(i);
for (size_t j = 0; j < w; j++)
{
tmp[j] = array(i, j);
}
}
return img;
}
3通道分割和合并
方法一
std::vector<cv::Mat> channelsSplistArray, channelsMergeArray;
cv::Mat buleChannel, redChannel, greenChannel,newAddchannel,imgMerge;
//分割, 相应通道颜色的会转为灰色
cv::split(line_img, channelsSplistArray); // &
buleChannel = channelsSplistArray.at(0); // 0 255 255
greenChannel = channelsSplistArray.at(1); // 255 0 255
redChannel = channelsSplistArray.at(2); // 255 255 0
cv::imshow("buleChannel", buleChannel);
cv::imshow("greenChannel", greenChannel);
cv::imshow("redChannel", redChannel);
// 合并三通道 设置blue为0
newAddchannel = channelsSplistArray.at(0).clone();
newAddchannel.setTo(0);
channelsMergeArray.push_back(newAddchannel);
channelsMergeArray.push_back(greenChannel);
channelsMergeArray.push_back(redChannel);
cv::merge(channelsMergeArray, imgMerge);
// 当通道设置为0 : 0为blue 1为green 2为red
/*channelsSplistArray[0] = cv::Scalar(0);
cv::merge(channelsSplistArray, imgMerge);*/
cv::imshow("imgMerge", imgMerge);
方法二
cv::Mat newAddchannel, imgMerge, imgChannelSplitArray[3];
// 分割
cv::split(line_img, imgChannelSplitArray)