Matlab 進階學習記錄css
最近在看 Faster RCNN的Matlab code,發現不少matlab技巧,活到老,學到老。。。html
1. conf_proposal = proposal_config('image_means', model.mean_image, 'feat_stride', model.feat_stride);python
function conf = proposal_config(varargin)
% conf = proposal_config(varargin)
% --------------------------------------------------------
% Faster R-CNN
% Copyright (c) 2015, Shaoqing Ren
% Licensed under The MIT License [see LICENSE for details]
% --------------------------------------------------------
ip = inputParser ;
%% training
ip.addParamValue('use_gpu', gpuDeviceCount > 0, ... @islogical);
% whether drop the anchors that has edges outside of the image boundary
ip.addParamValue('drop_boxes_runoff_image', ...
true, @islogical);
% Image scales -- the short edge of input image
ip.addParamValue('scales', 600, @ismatrix);
% Max pixel size of a scaled input image
ip.addParamValue('max_size', 1000, @isscalar);
% Images per batch, only supports ims_per_batch = 1 currently
ip.addParamValue('ims_per_batch', 1, @isscalar);
% Minibatch size
ip.addParamValue('batch_size', 256, @isscalar);
% Fraction of minibatch that is foreground labeled (class > 0)
ip.addParamValue('fg_fraction', 0.5, @isscalar);
% weight of background samples, when weight of foreground samples is
% 1.0
ip.addParamValue('bg_weight', 1.0, @isscalar);
% Overlap threshold for a ROI to be considered foreground (if >= fg_thresh)
ip.addParamValue('fg_thresh', 0.7, @isscalar);
% Overlap threshold for a ROI to be considered background (class = 0 if
% overlap in [bg_thresh_lo, bg_thresh_hi))
ip.addParamValue('bg_thresh_hi', 0.3, @isscalar);
ip.addParamValue('bg_thresh_lo', 0, @isscalar);
% mean image, in RGB order
ip.addParamValue('image_means', 128, @ismatrix);
% Use horizontally-flipped images during training ?
ip.addParamValue('use_flipped', true, @islogical);
% Stride in input image pixels at ROI pooling level (network specific)
% 16 is true for {Alex,Caffe}Net, VGG_CNN_M_1024, and VGG16
ip.addParamValue('feat_stride', 16, @isscalar);
% train proposal target only to labled ground-truths or also include
% other proposal results (selective search, etc.)
ip.addParamValue('target_only_gt', true, @islogical);
% random seed
ip.addParamValue('rng_seed', 6, @isscalar);
%% testing
ip.addParamValue('test_scales', 600, @isscalar);
ip.addParamValue('test_max_size', 1000, @isscalar);
ip.addParamValue('test_nms', 0.3, @isscalar);
ip.addParamValue('test_binary', false, @islogical);
ip.addParamValue('test_min_box_size',16, @isscalar);
ip.addParamValue('test_drop_boxes_runoff_image', ...
false, @islogical);
ip.parse(varargin{:}); conf = ip.Results;
assert(conf.ims_per_batch == 1, 'currently rpn only supports ims_per_batch == 1');
% if image_means is a file, load it...
if ischar(conf.image_means)
s = load(conf.image_means);
s_fieldnames = fieldnames(s);
assert(length(s_fieldnames) == 1);
conf.image_means = s.(s_fieldnames{1});
end
end
The inputParser
object allows you to manage inputs to a function by creating an input scheme. To check the input, you can define validation functions for required arguments, optional arguments, and name-value pair arguments. Optionally, you can set properties to adjust the parsing behavior, such as handling case sensitivity, structure array inputs, and inputs that are not in the input scheme.ios
After calling the parse
method to parse the inputs, the inputParser
saves names and values of inputs that match the input scheme (stored in Results
), names of inputs that are not passed to the function and, therefore, are assigned default values (stored in UsingDefaults
), and names and values of inputs that do not match the input scheme (stored in Unmatched
).json
Check the validity of required and optional function inputs.
Create a custom function with required and optional inputs in the file findArea.m.
function a = findArea(width,varargin)
p = inputParser;
defaultHeight = 1;
defaultUnits = 'inches';
defaultShape = 'rectangle';
expectedShapes = {'square','rectangle','parallelogram'};
addRequired(p,'width',@isnumeric); addOptional(p,'height',defaultHeight,@isnumeric); addParameter(p,'units',defaultUnits); addParameter(p,'shape',defaultShape,... @(x) any(validatestring(x,expectedShapes)));
parse(p,width,varargin{:});
a = p.Results.width .* p.Results.height;
The input parser checks whether width and height are numeric, and whether the shape matches a string in cell array expectedShapes. @ indicates a function handle, and the syntax @(x) creates an anonymous function with input x.
Call the function with inputs that do not match the scheme. For example, specify a nonnumeric value for the width input:
findArea('text')
Error using findArea (line 14)
The value of 'width' is invalid. It must satisfy the function: isnumeric.
Specify an unsupported value for shape:
findArea(4,'shape','circle')
Error using findArea (line 14)
The value of 'shape' is invalid. Expected input to match one of these strings:
square, rectangle, parallelogram
The input, ''circle'', did not match any of the valid strings.
http://www.cnblogs.com/heleifz/p/matlab-function-handle.html 網絡
2. assert 語句的使用:app
assert: Generate an error when a condition is violated. dom
assert(EXPRESSION, ERRMSG) evaluates EXPRESSION and, if it is false, displays the string contained in ERRMSG. When ERRMSG is the last input to assert, MATLAB displays it literally, without performing any substitutions on the characters in ERRMSG.ide
例如:若是 contion 不成立,則會輸出對應的:提示錯誤信息。函數
assert(mod(conf.batch_size, num_images) == 0, ...
sprintf('num_images %d must divide BATCH_SIZE %d', num_images, conf.batch_size));
3. permute 函數:
Permute array dimensions.
B = permute(A,ORDER) rearranges the dimensions of A so that they
are in the order specified by the vector ORDER.
從新安排矩陣的x,y,z , 在二維中就至關於把x,y 對換,在三維中至關於能夠把三個座標的位置互換。
好比A =
A(:,:,1)=repmat(1,3,3);
A(:,:,2)=repmat(2,3,3);
A(:,:,3)=repmat(3,3,3);
disp(A);
A(:,:,1) =
1 1 1
1 1 1
1 1 1
A(:,:,2) =
2 2 2
2 2 2
2 2 2
A(:,:,3) =
3 3 3
3 3 3
3 3 3
At = permute(A,[3,2,1]);
disp(At);
At(:,:,1) =
1 1 1
2 2 2
3 3 3
At(:,:,2) =
1 1 1
2 2 2
3 3 3
At(:,:,3) =
1 1 1
2 2 2
3 3 3
permute(A,[3,2,1])
4. cellfun 函數:
cellfun: Apply a function to each cell of a cell array. A = cellfun(FUN, C) applies the function specified by FUN to the contents of each cell of cell array C, and returns the results in the array A.
5. 從列表 A 中去搜索列表 B 中是否存在有相交元素,即:求 A and B 的差。
select = importdata('/home/wangxiao/Documents/Sun-80-dataset/VGG_16/iter_1/SUN80_50%_selected_without_HD.txt');
Unlabel = importdata('/home/wangxiao/Documents/Sun-80-dataset/iter_1/Sun_100_UnLabel_Train_0.5_.txt');
fid = fopen('/home/wangxiao/Documents/Sun-80-dataset/VGG_16/iter_1/SUN80_50%_Unselected_data.txt', 'a') ;
selected_list = [] ;
unselected_list = [] ;
for i = 1:size(Unlabel.data, 1)
disp(['deal with: ', num2str(i) , '/' , num2str(size(Unlabel.data, 1))]) ;
unlabel_name = Unlabel.textdata{i, 1}; % Unlabel image name
unlabel_label = Unlabel.data(i, 1) ; % Unlabel image label
count = 0;
for j = 1:size(select.textdata, 1)
select_name = select.textdata{j, 1}; % selected image name
if strcmp(unlabel_name, select_name) % if have selected, jump it.
selected_list = [selected_list; unlabel_name];
% break;
else
count = count + 1;
end
if count == size(select.textdata, 1)
fprintf(fid, '%s ', num2str(unlabel_name));
fprintf(fid, '%s \n', num2str(unlabel_label));
end
end
end
6. containers.Map() 的用法
matlab中的containers.Map()有點相似於C++ STL中的map容器,具備key/value映射的功能.
num = containers.Map({1, 2, 3}, {'one', 'two', 'three'})
myMap = containers.Map(KEYS, VALUES) constructs a Map object myMap that contains one or more keys and a value for each of these keys, as specified in the KEYS and VALUES arguments.
例如:從 Map 上提取一個值:myValue = myMap(key) ;
修改鍵值對 (key-values pairs): myMap(key) = newValue ;
增長一個新的鍵值對:myMap(key) = newValue ;
能夠經過 remove 的方法將 values 刪除掉。
7. try catch end 機制:
該機制能夠防止因爲程序中可能出現的錯誤而終止運行的狀況:
try
ld = load(anchor_cache_file) ;
anchors = ld.anchors ;
catch
base_anchor = [1, 1, opts.base_size, opts.base_size] ;
ratio_anchors = ratio_jitter(base_anchor, opts.ratios) ;
end
8. About change the gray image into 3 channel RGB image:
1 clc; close all; clear all; 2 image = imread('/home/wangxiao/Documents/mnist_dataset/mnist_0_.png'); 3 image = im2double(image); 4 image = double(image); 5 width = size(image, 1); height = size(image, 2); 6
7 synthetic = zeros([224, 224]); 8
9 for i = 1:size(image, 1) 10 for j = 1:size(image, 2) 11
12 synthetic(i, j) = image(i, j); 13 synthetic(i, j) = image(i, j); 14 synthetic(i, j) = image(i, j); 15 end 16 end 17 synthetic = im2uint8(synthetic); 18 imshow(synthetic); 19 figure; imshow(image); 20
21 %%
22 synthetic2 = zeros([224, 224, 3]); 23
24 for i = 1:size(image, 1) 25 for j = 1:size(image, 2) 26
27 synthetic2(i, j, 1) = image(i, j, 1); 28 synthetic2(i, j, 2) = image(i, j, 2); 29 synthetic2(i, j, 3) = image(i, j, 3); 30 end 31 end 32 synthetic2 = im2uint8(synthetic2); 33 imshow(synthetic2);
synthetic is a single channel image, and synthetic2 is a three channel image.
Another Solution is:
% if grayscale repeat one channel to match filters size
if(size(im, 3)==1)
im = repmat(im, [1 1 3]);
end
9. Divided the image into specific patches using matlab function: mat2cell
This is a really cool function. For example, you read one image and divide it into 3*3 = 9 patches, and we assume the resolution of the image is: 100*100, you just need set the vectors M = [20, 30, 50]; N = [20, 20, 60] ;
Actually, as long as the sum of three values you set equal to 100 (here is 20, 30, 50), it will be ok. The other vector N have the same reason.
10. Read images from disks and save these frames into avi video files.
1 %% change the frame to videos to save. 2 clc; close all; clear all; 3 path = '/home/wangxiao/Downloads/files/Visual_Tracking/MDNet-CVPR2016/saved_tracking_results_MDNet_OTB100/Biker/'; 4 files = dir([path, '*.png']); 5 count = 0; 6
7 for i=1:size(files, 1) 8 xxx = strtok(files(i).name, 'M'); 9 name = xxx(7:end-1); 10 image = imread([path, files(i).name]); 11 index = sprintf('%04d', str2double(name)); 12 newName = [ index,'.jpg']; 13
14 % a = sprintf('%04d',i); 15
16 imwrite(image, [path, newName]); 17 end
18
19 disp('==>> deal with image done !') 20
21
22 jpgFiles = dir([path, '*.jpg']); 23 videoName = '/home/wangxiao/Videos/Biker_MDNet_OTB100.avi'; 24 fps = 25; %幀率 25 startFrame = 1; %從哪一幀開始 26 endFrame = size(jpgFiles, 1); %哪一幀結束 27
28 %生成視頻的參數設定 29 aviobj=VideoWriter(videoName); %建立一個avi視頻文件對象,開始時其爲空 30 aviobj.FrameRate=fps; 31
32 open(aviobj);%Open file for writing video data 33
34 for i=startFrame:endFrame 35 frames = imread([path, jpgFiles(i).name]); 36 frames = im2frame(frames); 37 writeVideo(aviobj, frames); 38 end
39 close(aviobj); 40
41 disp('==>> saved the video !')
11. Matlab中save實現保存數據到mat文件的正確使用 參考:http://blog.csdn.net/fx677588/article/details/52836348
1 1. 普通保存在當前文件夾下 2
3 save matPath.mat A B; % A B都是生成的數據矩陣 4
5 須要注意這種方式只能將數據保存在當前文件夾下的第一個參數文件中,下面這樣寫並不能將數據保存到你想要的文件夾中的。 6
7 saldir = './result/'; 8 savePath = [saldir imnames(len).name(1:end-4) '_KSD']; 9 save savePath A; 10
11 上面程序也只能實如今當前文件夾下生成savePath.mat文件,而後數據保存到該文件中。並不能保存到須要的文件夾中。正確的寫法是下面的方式。 12
13 2. 保留數據到其餘文件夾下 14
15 saldir = './result/'; 16 savePath = [saldir imnames(len).name(1:end-4) '_KSD' '.mat']; 17 save(savePath,'A'); % 保存到其餘文件夾的寫法 18
19 這裏也須要注意,保存的數據矩陣,即save函數的第二個參數不能夠忘記單引號。
12. 根據 attention maps 置信度的高低,生成對應的 bounding box :
clc;close all;clear all; Img=imread('/home/wangxiao/Documents/files/Visual_Tracking/MDNet-CVPR2016/MDNet-master/attentionMap/Basketball/0001.png'); if ndims(Img)==3 I=rgb2gray(Img); else I=Img; end I=im2bw(I,graythresh(I)); [m,n]=size(I); imshow(I);title('binary image'); txt=get(gca,'Title'); set(txt,'fontsize',16); L=bwlabel(I); stats=regionprops(L,'all'); set(gcf,'color','w'); set(gca,'units','pixels','Visible','off'); q=get(gca,'position'); q(1)=0;%設置左邊距離值爲零 q(2)=0;%設置右邊距離值爲零 set(gca,'position',q); for i=1:length(stats) hold on; rectangle('position',stats(i).BoundingBox,'edgecolor','y','linewidth',2); temp = stats(i).Centroid; plot(temp(1),temp(2),'r.'); drawnow; end frame=getframe(gcf,[0,0,n,m]); im=frame2im(frame); imwrite(im,'a.jpg','jpg');%能夠修改保存的格式
Python Implementation: (from: https://www.jianshu.com/p/7693222523c0 )
import numpy as np import scipy.ndimage as ndi from skimage import measure,color import matplotlib.pyplot as plt #編寫一個函數來生成原始二值圖像 def microstructure(l=256): n = 5 x, y = np.ogrid[0:l, 0:l] #生成網絡 mask = np.zeros((l, l)) generator = np.random.RandomState(1) #隨機數種子 points = l * generator.rand(2, n**2) mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1 mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯濾波 return mask > mask.mean() data = microstructure(l=128)*1 #生成測試圖片 labels=measure.label(data,connectivity=2) #8連通區域標記 dst=color.label2rgb(labels) #根據不一樣的標記顯示不一樣的顏色 print('regions number:',labels.max()+1) #顯示連通區域塊數(從0開始標記) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4)) ax1.imshow(data, plt.cm.gray, interpolation='nearest') ax1.axis('off') ax2.imshow(dst,interpolation='nearest') ax2.axis('off') fig.tight_layout() plt.show()
若是想分別對每個連通區域進行操做,好比計算面積、外接矩形、凸包面積等,則須要調用measure子模塊的regionprops()函數。該函數格式爲:
skimage.measure.regionprops(label_image)
返回全部連通區塊的屬性列表,經常使用的屬性列表以下表:
屬性名稱 類型 描述 area int 區域內像素點總數 bbox tuple 邊界外接框(min_row, min_col, max_row, max_col) centroid array 質心座標 convex_area int 凸包內像素點總數 convex_image ndarray 和邊界外接框同大小的凸包 coords ndarray 區域內像素點座標 Eccentricity float 離心率 equivalent_diameter float 和區域面積相同的圓的直徑 euler_number int 區域歐拉數 extent float 區域面積和邊界外接框面積的比率 filled_area int 區域和外接框之間填充的像素點總數 perimeter float 區域周長 label int 區域標記
13. 將 video 切割爲 frame:
%% Input 2 videos and divide it into frames
clc; clear all; close all;
infraredvideo = 'C:\Users\王逍\Desktop\跟蹤數據集\videos\';
savePath = 'C:\Users\王逍\Desktop\跟蹤數據集\frames\';
% devide the infrared video into infrared images
videoList1=dir(fullfile(infraredvideo,'*.mp4'));
video_num=length(videoList1);
for j=1:video_num
infraredOutPath = [savePath, videoList1(j).name, '\'];
mkdir(infraredOutPath);
frames = VideoReader([strcat(infraredvideo,videoList1(j).name)]);
numFrames =frames.NumberOfFrames;
for k = 1 : numFrames
disp(['==>> processing video ',num2str(k),' frames, please waiting....']);
frame = read(frames,k);
frame = imresize(frame, [480, 640]);
% figure(1); imshow(frame);
imwrite(frame, [infraredOutPath, sprintf('%08d.png',k)]);
end
end
14. divide the total attention maps according to given video frames such as TC128.
1 %%
2 clc; close all; clear all; 3 path = '/media/wangxiao/E1F171026416B63F/tracking_benchmark/Temple-color-128/predicted_attentionMaps-v1/'; 4 attentionfiles = dir([path, '*.png']); 5
6 videoPath = '/media/wangxiao/E1F171026416B63F/tracking_benchmark/Temple-color-128/videos/'; 7 videoFiles = dir(videoPath); 8 videoFiles = videoFiles(3:end); 9 total = 0; 10 savepath = '/media/wangxiao/E1F171026416B63F/tracking_benchmark/Temple-color-128/attentionMaps_per_video-v1/'; 11
12
13 for i=1:size(videoFiles, 1) 14 numCount = 0; 15 videoName = videoFiles(i).name; 16 newVideoPath = [videoPath videoName '/img/']; 17
18 videoframes = dir([newVideoPath, '*.jpg']); 19
20 savePath = [savepath videoName '/']; 21 mkdir(savePath); 22
23 disp(['==>> deal with video file: ', num2str(i)]); 24 % total = total + size(videoframes, 1); 25
26 for j=1:size(videoframes, 1) 27 if numCount < size(videoframes, 1) 28 total = total + 1; 29 numCount = numCount + 1; 30 img = imread([path attentionfiles(total).name]); 31 % figure(1); imshow(img); 32
33 temp = sprintf('%04d', numCount); 34 saveName = [temp '.png']; 35 imwrite(img, [savePath saveName]); 36 else
37 break; 38 end
39
40
41
42 end
43
44
45
46 end
47
15. count the image list into txt files.
1 %%
2 market1501_path = '/home/wangxiao/Downloads/person-ReID/open-reid/examples/data/market1501/'; 3 txtsavePath = '/home/wangxiao/Downloads/person-ReID/open-reid/examples/data/market1501/image_txt_list/'; 4
5 bounding_box_test = [market1501_path 'bounding_box_test/']; 6 bounding_box_train = [market1501_path 'bounding_box_train/']; 7 gt_bbox = [market1501_path 'gt_bbox/']; 8 gt_query = [market1501_path 'gt_query/']; 9 images = [market1501_path 'images/']; 10 query = [market1501_path 'query/']; 11
12
13 % #####################
14 bounding_box_test_files = dir([bounding_box_test, '*.jpg']); 15 bounding_box_train_files = dir([bounding_box_train, '*.jpg']); 16 gt_bbox_files = dir([gt_bbox, '*.jpg']); 17 gt_query_files = dir([gt_query, '*.jpg']); 18 images_files = dir([images, '*.jpg']); 19 query_files = dir([query, '*.jpg']); 20
21 %% image files I 22 fid = fopen([txtsavePath 'bounding_box_test_files_image_list.txt'], 'w'); 23 for i=1:size(bounding_box_test_files, 1) 24 imgName = bounding_box_test_files(i).name; 25 fprintf(fid, '%s \n', imgName); 26 end
27 fclose(fid); 28 disp('==>> done I'); 29
30 %% image files II 31 fid = fopen([txtsavePath 'bounding_box_train_files_image_list.txt'], 'w'); 32 for i=1:size(bounding_box_train_files, 1) 33 imgName = bounding_box_train_files(i).name; 34 fprintf(fid, '%s \n', imgName); 35 end
36 fclose(fid); 37 disp('==>> done II'); 38
39 %% image files III 40 fid = fopen([txtsavePath 'gt_bbox_files_image_list.txt'], 'w'); 41 for i=1:size(gt_bbox_files, 1) 42 imgName = gt_bbox_files(i).name; 43 fprintf(fid, '%s \n', imgName); 44 end
45 fclose(fid); 46 disp('==>> done III'); 47
48
49 %% image files IV 50 fid = fopen([txtsavePath 'gt_query_files_image_list.txt'], 'w'); 51 for i=1:size(gt_query_files, 1) 52 imgName = gt_query_files(i).name; 53 fprintf(fid, '%s \n', imgName); 54 end
55 fclose(fid); 56 disp('==>> done IV'); 57
58
59 %% image files V 60 fid = fopen([txtsavePath 'images_files_image_list.txt'], 'w'); 61 for i=1:size(images_files, 1) 62 imgName = images_files(i).name; 63 fprintf(fid, '%s \n', imgName); 64 end
65 fclose(fid); 66 disp('==>> done V'); 67
68
69
70
71 %% image files VI 72 fid = fopen([txtsavePath 'query_files_image_list.txt'], 'w'); 73 for i=1:size(query_files, 1) 74 imgName = query_files(i).name; 75 fprintf(fid, '%s \n', imgName); 76 end
77 fclose(fid); 78 disp('==>> done VI');
16. load json files using matlab code.
this used package from: http://blog.csdn.net/sophia_xw/article/details/70141208
unzip this file and add path to matlab like this:
clear all; clc
addpath('/home/wangxiao/jsonlab-1.5/jsonlab-1.5');
fname='results.json';
jsonData=loadjson(fname);
17. 僞彩色圖像的生成:
%% clc; close all; clear all; path = '\MotorRolling\'; files = dir([path, '*.png']); savePath = '\fakeColor_MotorRolling\'; ori_img_path = '\Benchmark\MotorRolling\img\'; ori_img = imread([ori_img_path, '0001.jpg']); oriFiles = dir([ori_img_path, '*.jpg']); height = size(ori_img, 1); width = size(ori_img, 2); for img_idex =1:length(files) im = imread([path, files(img_idex).name]); originalImage = imread([ori_img_path, oriFiles(img_idex).name]); % for idx =1:size(im, 1) % for jdx = 1:size(im, 2) % if im(idx, jdx) <= 30; % im(idx, jdx) = 0; % end % end % end I=double(im); [m,n]=size(I); L=256; for i=1:m for j=1:n if I(i,j)<=L/4 R(i,j)=0; G(i,j)=4*I(i,j); B(i,j)=L; else if I(i,j)<=L/2 R(i,j)=0; G(i,j)=L; B(i,j)=-4*I(i,j)+2*L; else if I(i,j)<=3*L/4 R(i,j)=4*I(i,j)-2*L; G(i,j)=L; B(i,j)=0; else R(i,j)=L; G(i,j)=-4*I(i,j)+4*L; B(i,j)=0; end end end end end for i=1:m for j=1:n rgbim(i,j,1)=R(i,j); rgbim(i,j,2)=G(i,j); rgbim(i,j,3)=B(i,j); end end rgbim=rgbim/256; % figure; % subplot(1,2,1); % imshow(gray); % subplot(1,2,2); fake_color_img = imresize(rgbim, [height, width]); imshow(fake_color_img); imwrite(fake_color_img, [savePath, oriFiles(img_idex).name]); img_idex end
%% clc; close all; clear all; videoPath='\demo_videos\demo_Skater2\'; salVideo = '\Benchmark\Skater2\img\'; resultsPath = '\saved_figure_tracking_results\Skater2\v\'; file=dir([videoPath,'*.jpg']); file_=dir([salVideo,'*.jpg']); resultsFiles = dir([resultsPath, '*.jpg']); writerObject = VideoWriter('OUR_Skater2.avi'); writerObject.FrameRate =25; %writerObject.Quality = 50; open( writerObject ); Num= length(file); for k =1 : Num trackingResults = imread([resultsPath, resultsFiles(k).name]); disp(['processing the ',num2str(k),'/',num2str(Num),' frames, please waiting....']); frame_1 = imread([videoPath,file(k).name]); frame_222 = imread([salVideo,file_(k).name]); frame_2 = zeros(size(frame_222, 1), size(frame_222, 2), 3); if size(frame_222, 3) == 1 frame_2(:,:,1) = frame_222; frame_2(:,:,1) = frame_222; frame_2(:,:,1) = frame_222; end frame_2 = uint8(frame_2); frame_3 = frame_1*0.5+frame_2*0.5; trackingResults = imresize(trackingResults, [size(frame_2, 1), size(frame_2, 2)]); fullframe = [ frame_2, frame_3, trackingResults ]; writeVideo( writerObject, fullframe ); end close( writerObject );
19. video to frame transformation:
clear all;close all; %% video videoPath='.\2\'; outPath='.\2\'; T=[1.72844 0.0692766 -293 -0.0692766 1.72844 -94 0 0 1]; tform = maketform('affine', T'); videoList=dir(fullfile(videoPath,'*.avi')); video_num=length(videoList); for j=1:video_num frames = VideoReader (strcat(videoPath,videoList(j).name)); numFrames =frames.NumberOfFrames; for k = 1 : numFrames disp(['processing the ',num2str(k),' frames, please waiting....']); frame = read(frames,k); transformFrame = imtransform(frame,tform,'XData',[1 320], 'YData',[1 240]); % frame=imresize(frame,[288,384]); imwrite(transformFrame,[outPath,sprintf('%08d.png',k)]); end end