我正在尝试编写代码帮助我完成生物学工作.代码的概念是分析组织中收缩细胞的视频文件
示例2:youtube.com/watch?v=uG_WOdGw6Rk
并绘制出以下内容:
所以我编写了一个Matlab代码,它将遍历视频并比较每个帧与其后的帧,并查看帧中是否有任何变化并在曲线上绘制这些变化.
我的代码结果示例

我写的当前代码的核心:
for i=2:totalframes
compared=read(vidObj,i);
ref=rgb2gray(compared);%% convert to gray
level=graythresh(ref);%% calculate threshold
compared=im2bw(compared,level);%% convert to binary
differ=sum(sum(imabsdiff(vid,compared))); %% get sum of difference between 2 frames
if (differ ~=0) && (any(amp==differ)==0) %%0 is = no change happened so i dont wana record that !
amp(end+1)=differ; % save difference to array amp wi
time(end+1)=i/framerate; %save to time array with sec's, used another array so i can filter both later.
vid=compared; %% save current frame …Run Code Online (Sandbox Code Playgroud) 我有一个电影文件,我有兴趣录制一个点的运动; 圆形特征的中心是具体的.我试图在Matlab中使用边缘检测和角点检测技术来执行此操作.
要执行此操作,如何在视频中指定感兴趣的区域?subplot是个好主意吗?
我试图使用二进制掩码执行此操作,如下所示,
hVideoSrc = vision.VideoFileReader('video.avi','ImageColorSpace', 'Intensity');
hEdge = vision.EdgeDetector('Method', 'Prewitt','ThresholdSource', 'Property','Threshold', 15/256, 'EdgeThinning', true);
hAB = vision.AlphaBlender('Operation', 'Highlight selected pixels');
WindowSize = [190 150];
hVideoOrig = vision.VideoPlayer('Name', 'Original');
hVideoOrig.Position = [10 hVideoOrig.Position(2) WindowSize];
hVideoEdges = vision.VideoPlayer('Name', 'Edges');
hVideoEdges.Position = [210 hVideoOrig.Position(2) WindowSize];
hVideoOverlay = vision.VideoPlayer('Name', 'Overlay');
hVideoOverlay.Position = [410 hVideoOrig.Position(2) WindowSize];
c = [123 123 170 170];
r = [160 210 210 160];
m = 480; % height of pout image
n = 720; % width of pout …Run Code Online (Sandbox Code Playgroud) matlab image-processing video-processing computer-vision matlab-cvst
我有一个视频engine2.avi,我想用openCV阅读和展示.这是我的代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
string filename = "D:\\BMDvideos\\engine2.avi";
VideoCapture capture(filename);
Mat frame;
if( !capture.isOpened() )
throw "Error when reading steam_avi";
namedWindow("w", 1);
for( ; ; )
{
capture >> frame;
//if(!frame)
// break;
imshow("w", frame);
waitKey(20); // waits to display frame
}
waitKey(0);
}
Run Code Online (Sandbox Code Playgroud)
如果我的文件有编解码器YUV 4:2:2 (UYVY)(我使用Direct-Show录制视频),此代码不起作用,但是当我使用视频时,我可以使用openCV!
有谁知道这是如何工作的?
更新:
在阅读了一些链接后,建议捕获异常将解决问题,我修改了我的代码.它没有帮助,但这里是修改后的代码:
cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;
try
{
cap >> frame;
}
catch(cv::Exception ex)
{
std::cout …Run Code Online (Sandbox Code Playgroud) 我正在从视频中提取每一帧AVAssetImageGenerator,但有时它会连续两次返回我几乎相同的图像(它们没有相同的"帧时间").有趣的是它总是发生(在我的测试视频中)每5帧.
这里和这里是两个图像(在新选项卡中打开每个图像然后切换选项卡以查看差异).
这是我的代码:
//setting up generator & compositor
self.generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;
self.composition = [AVVideoComposition videoCompositionWithPropertiesOfAsset:asset];
NSTimeInterval duration = CMTimeGetSeconds(asset.duration);
NSTimeInterval frameDuration = CMTimeGetSeconds(composition.frameDuration);
CGFloat totalFrames = round(duration/frameDuration);
NSMutableArray * times = [NSMutableArray array];
for (int i=0; i<totalFrames; i++) {
NSValue * time = [NSValue valueWithCMTime:CMTimeMakeWithSeconds(i*frameDuration, composition.frameDuration.timescale)];
[times addObject:time];
}
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
// If actualTime is not equal to requestedTime image …Run Code Online (Sandbox Code Playgroud) 我试图理解这个色度键过滤器是如何工作的.如果您不知道,色度键是绿屏效果.有人能够解释这些功能中的某些功能是如何工作的以及它们究竟在做什么?
float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b;
float maskCr = 0.7132 * (colorToReplace.r - maskY);
float maskCb = 0.5647 * (colorToReplace.b - maskY);
float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b;
float Cr = 0.7132 * (textureColor.r - Y);
float Cb = 0.5647 * (textureColor.b - Y);
float blendValue = smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb)));
gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue); …Run Code Online (Sandbox Code Playgroud) 我试图通过Android应用程序上的IP摄像头流式传输视频.我已成功使用以下内容获取视频:
现在,所有这些情况都在起作用,但即使在本地网络上也平均滞后7-8秒.
我看到一些应用程序即使在使用移动端口(18600)的远程网络上也没有任何延迟.此端口通常与相机上的P2P模式相关联(此假设完全基于我的理解,根据我的相机设置界面上可用的以下设置,其显示:模式 - P2P,端口 - 18600,实时 - 正常).
有人可以帮我理解我们如何在P2P模式下连接到IP摄像头的移动端口?以及这种模式如何不显示RTSP的延迟?
提前致谢.
我有视频文件,我试图一次处理一帧.我尝试使用VideoCapture类进行以下类型的代码阅读.问题是如果以25帧/秒的速度录制视频文件,则读取速度相同.如何像我的电脑一样快速地获取帧可以解码它们?
我计划处理视频流,然后将其存储到文件中.
import cv2
import sys
import time
cap = cv2.VideoCapture(sys.argv[1])
start = time.time()
counter = 0
while True:
counter += 1;
image = cap.read()[1]
if counter %25 == 0:
print "time", time.time() - start
Run Code Online (Sandbox Code Playgroud)
输出:每25帧打印一次时间戳.注意时间戳在每一行上几乎完全改变1秒=>程序处理大约每秒25帧.这与视频文件是25帧/秒.
time 1.25219297409
time 2.25236606598
time 3.25211691856
time 4.25237703323
time 5.25236296654
time 6.25234603882
time 7.252161026
time 8.25258207321
time 9.25195503235
time 10.2523479462
Run Code Online (Sandbox Code Playgroud)
可能VideoCapture是这种工作的错误API,但是使用什么呢?
使用Linux,Fedora 20,opencv-python 2.4.7和python 2.7.5.
使用AForge ffmpeg包装器,您可以使用VideoFileReader类从视频中提取帧并将其另存为位图.
请参阅此示例: 提取.avi文件的帧
我的问题是你无法指定从何处开始阅读框架.它始终从视频文件的开头开始.
但是,如果我想提取两个小时长的视频文件中的帧,该怎么办?使用该类,您必须解析整个第一个小时的juste以获得这些帧.
有谁知道实现这一目标的方法?
我正在寻找有效的方法来减少一些视频权重(作为File上传),明显的答案是:让我们降低分辨率!(全高清或4K不需要,简单的高清对我来说已经足够了)我已经尝试了很多方法应该通过很多API(需要10),最好的方法是使用android-ffmpeg-java,但是...我的漂亮快速几乎当前的旗舰设备整个过程持续约length_of_video*4秒,此lib的重量是9 Mb,这个数量增加了我的应用程序大小...没有wai!(12 Mb到1 Mb是很好的结果,但仍然有太多的缺陷)
所以我决定使用原生的Android方式来实现这一点,MediaMuxer并且MediaCodec- 它们分别来自API18和API16(旧设备用户:抱歉;但他们也经常使用"低分辨率"相机).下面的方法几乎可以工作 - MediaMuxer不尊重MediaFormat.KEY_WIDTH和MediaFormat.KEY_HEIGHT- 提取File是"重新压缩",重量稍微小一点,但分辨率与原始视频相同File...
那么,问题:如何使用MediaMuxer和其他随附的类和方法压缩和重新调整/更改视频的分辨率?
public File getCompressedFile(String videoPath) throws IOException{
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(videoPath);
int trackCount = extractor.getTrackCount();
String filePath = videoPath.substring(0, videoPath.lastIndexOf(File.separator));
String[] splitByDot = videoPath.split("\\.");
String ext="";
if(splitByDot!=null && splitByDot.length>1)
ext = splitByDot[splitByDot.length-1];
String fileName = videoPath.substring(videoPath.lastIndexOf(File.separator)+1,
videoPath.length());
if(ext.length()>0)
fileName=fileName.replace("."+ext, "_out."+ext);
else
fileName=fileName.concat("_out");
final File outFile = new File(filePath, …Run Code Online (Sandbox Code Playgroud) 我试图在视频的每一帧上绘制一个位图作为叠加.我找到了一个关于如何解码和编码视频的例子,它正在发挥作用.这个例子有一个TextureRenderer类,它有一个drawFrame我需要修改的函数才能添加位图.我是opengl的新手,但我了解到我需要用位图创建一个纹理并绑定它.我在下面的代码中尝试过,但它抛出异常.
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS …Run Code Online (Sandbox Code Playgroud) video-processing ×10
android ×3
matlab ×2
opencv ×2
video ×2
avfoundation ×1
bitmap ×1
c# ×1
c++ ×1
camera ×1
colors ×1
directshow ×1
ffmpeg ×1
glsl ×1
ios ×1
ip-camera ×1
java ×1
matlab-cvst ×1
mediacodec ×1
mediamuxer ×1
opengl ×1
python ×1