随机颜色
- 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
颜色处理在图形学里面是比较基本的操作,必须掌握。