OpenCV C++ 简单小技巧 - 颜色处理与位操作 (2

随机颜色

  • 1 超简单
Scalar::all(-1)
  • 2 自己实现
    Scalar color( arc4random()&255, arc4random()&255, arc4random()&255 );
    Scalar color( rand()&255, rand()&255, rand()&255 );

填充单色

mat.setTo(Scalar(255,255,255));

填充固定数值的矩阵

Mat::ones(5, 5, CV_8U);
Mat::ones(5, 5, CV_8U)*10;

颜色空间变换

cvtColor(A, final, COLOR_BGR2RGB);

空间格式变化

boxPoints2f.assignTo(boxPointsCov,CV_8U);

图像混合

叠加,a+b超过255会封顶255
add(A, B, final);

image.png

权重叠加,用于可以渐变过渡
addWeighted(A, .2, B, .8, 1, final);

image.png

位操作
两图片叠加,上层图片黑色部分改为透明

Mat Agray,Bgray,mask,mask_inv,AFinal,BFinal;
cvtColor(B, Bgray, COLOR_BGR2GRAY);
threshold(Bgray, mask, 10, 255, THRESH_BINARY);
bitwise_not(mask, mask_inv);
bitwise_and(A, A,AFinal, mask_inv);
bitwise_and(B, B, BFinal, mask);
add(AFinal, BFinal, final);
image.png

获得运行时间差

int64 v= getTickCount();
//code here
NSLog(@"tick %f",(getTickCount()-v)/getTickFrequency());
//tick 0.005855

获得颜色通道数

final.channels();

获取视频第一帧

v2代码

NSString* fileName = @"v4.mp4";
id res = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName];
Mat frame;
CvCapture* capture = cvCreateFileCapture([res cStringUsingEncoding:NSUTF8StringEncoding]);
IplImage* cvim = cvQueryFrame(capture);
Mat frame1 = cvarrToMat(cvim);

v3代码

SString* fileName = @"v4.mp4";
id res = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName];
Mat frame;
capture = VideoCapture([res cStringUsingEncoding:NSUTF8StringEncoding]);
long frameTotal = capture.get(CV_CAP_PROP_FRAME_COUNT);
Mat frame;
if (!capture.isOpened()) {
    return;
}
capture.set(CV_CAP_PROP_POS_FRAMES, 30);
double frameRate = capture.get(CV_CAP_PROP_FPS);
while (true) {
    if (!capture.read(frame)) {
        
    }
    break;
}
ZSAsync(^{
    cvtColor(frame, frame, CV_BGR2RGB);
    imgId.image = MatToUIImage(frame);
});

设置颜色阀值

Mat hsv;
cvtColor(frame, hsv, CV_RGB2HSV);
Scalar hsv_blue_upper(44,255,255);
Scalar hsv_blue_lower(0,50,50);
Mat mask;
inRange(hsv, hsv_blue_lower, hsv_blue_upper, mask);
Mat res;
bitwise_and(frame, frame, res, mask);
image.png

创建随机噪点图片

Mat img=Mat::zeros(100,100,CV_8UC3);
for (int i=0; i<10000; i++) {
    int rx = i%100;//rand()%100;
    int ry = i/100%100;//rand()%100;
    img.at<Vec3b>(rx,ry)[0] = rand()%255;
    img.at<Vec3b>(rx,ry)[1] = rand()%255;
    img.at<Vec3b>(rx,ry)[2] = rand()%255;
}
image.png

颜色处理在图形学里面是比较基本的操作,必须掌握。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容