OpenCV Canny Edge直播视频
OpenCV Canny Edge on Live Video
我正试图在网络摄像头的实时视频上实现opencv的精明边缘检测。然而,我得到了这个错误:
OpenCV错误:不支持格式或格式组合<>在未知函数中,文件。。。。。。。。\ocv\opencv\src\cv\cvcanny.cpp,第66行
我想这是一个格式问题。我可以将3通道的8位RGB图像转换为1通道的灰度图像帧,然后对结果进行边缘检测。然而,我也无法在图像上实现rgb2灰度转换<此转换代码的通道数不正确>
下面是我在VS2008中实现的代码。对如何解决这个错误有什么想法吗?
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <cv.h>
#include <cvaux.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>
#include <string.h>
#include <cxtypes.h>
using namespace std;
using namespace cv;
int main(int, char**)
{
cvNamedWindow("Edges", CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCaptureFromCAM(0);
IplImage* frame;
while(1) {
frame = cvQueryFrame( capture );
int depth_img =frame->depth;
int height_img =frame->height;
int width_img =frame->width;
int size_img =frame->imageSize;
int nchan_img =frame->nChannels;
int nsize_img =frame->nSize;
cout << setw(15) << "depth" << depth_img << endl;
cout << setw(15) << "height" << height_img << endl;
cout << setw(15) << "width" << width_img << endl;
cout << setw(15) << "size" << size_img << endl;
cout << setw(15) << "nchan" << nchan_img << endl;
cout << setw(15) << "nsize" << nsize_img << endl;
IplImage* out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 3 );
cvSmooth( frame, out, CV_GAUSSIAN, 11, 11 );
cvCvtColor(out ,out, CV_RGB2GRAY);
cvCanny( out, out, 10, 10, 3 );
if( !frame ) break;
cvShowImage( "Edge", out );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Edge" );
return 0;
}
问题是您在每个上都传递一个3通道图像
IplImage* out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 3 );
创建单通道的另外两个图像并使用它们:
IplImage* gray_out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );
IplImage* canny_out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );
并将其用于:
cvSmooth( frame, out, CV_GAUSSIAN, 11, 11 );
cvCvtColor(out , gray_out, CV_RGB2GRAY);
cvCanny( gray_out, canny_out, 10, 10, 3 );
if( !frame ) break;
cvShowImage( "Edge", canny_out );
这对我有效:
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <cv.h>
#include <cvaux.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>
#include <string.h>
using namespace std;
using namespace cv;
int main(int, char**)
{
cvNamedWindow("Edges", CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCaptureFromCAM(0);
IplImage* frame;
while(1) {
frame = cvQueryFrame( capture );
int depth_img =frame->depth;
int height_img =frame->height;
int width_img =frame->width;
int size_img =frame->imageSize;
int nchan_img =frame->nChannels;
int nsize_img =frame->nSize;
cout << setw(15) << "depth" << depth_img << endl;
cout << setw(15) << "height" << height_img << endl;
cout << setw(15) << "width" << width_img << endl;
cout << setw(15) << "size" << size_img << endl;
cout << setw(15) << "nchan" << nchan_img << endl;
cout << setw(15) << "nsize" << nsize_img << endl;
IplImage* out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 3 );
IplImage* gray_out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );
IplImage* canny_out = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );
cvSmooth( frame, out, CV_GAUSSIAN, 11, 11 );
cvCvtColor(out , gray_out, CV_RGB2GRAY);
cvCanny( gray_out, canny_out, 10, 10, 3 );
if( !frame ) break;
cvShowImage( "Edge", canny_out );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Edge" );
return 0;
}
您正在使用OpenCV 2.x吗?以下是同样有效的代码,但在以下几点之前:
- 请记住,OpenCV与BGR配合使用,因此在转换时,请使用CV_BGR2GRAY
- 小心Canny中的阈值,它们应该不同,并且比率为2或3(推荐(。可能会尝试100-200
- 尽量避免在每个循环中打印,这会降低代码的速度
- 对于过滤器,尽量不要使用大窗口。一个尺寸最多3或5通常是好的(取决于你的应用(。可能不需要11号
好的,这里的代码:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
using namespace cv;
int main(int, char**)
{
namedWindow( "Edges", CV_WINDOW_NORMAL );
CvCapture* capture = cvCaptureFromCAM(-1);
cv::Mat frame; cv::Mat out; cv::Mat out2;
while(1) {
frame = cvQueryFrame( capture );
GaussianBlur( frame, out, Size(5, 5), 0, 0 );
cvtColor( out ,out2, CV_BGR2GRAY ); // produces out2, a one-channel image (CV_8UC1)
Canny( out2, out2, 100, 200, 3 ); // the result goes to out2 again,but since it is still one channel it is fine
if( !frame.data ) break;
imshow( "Edges", out2 );
char c = cvWaitKey(33);
if( c == 'c' ) break;
}
return 0;
}
顺便说一句,你可以考虑使用cv::Mat。它比IplImage灵活得多,事实上(不再发布图像…(
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img;
VideoCapture cap(0);
while (true)
{
cap >> img;
Mat edges;
cvtColor(img, edges, CV_BGR2GRAY);
Canny(edges, edges, 30, 60);
imshow("window label", edges);
waitKey(1);
}
return 0;
}
这就是我使用canny函数拍摄的方式。
相关文章:
- 如何在c++中录制具有精确帧时间戳的视频
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何使用OpenCV-C++编写*.mp4视频?
- 开放 CV 中的动态内存分配,用于视频处理
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- OpenCV QT,显示视频的帧(不使用while循环)
- FFmpeg——使用硬件加速进行视频解码
- 在 openCV 中手动停止视频
- 强制Qt相机视频格式
- 在macOS Mojave上尝试OpenCV视频捕获时"Abort Trap: 6"
- 节目练习直播C++
- 应用程序在打开的简历中捕获视频后没有响应
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 如何在 c++ 中通过 http 发送大型视频文件?
- 在 QLabel 中显示视频
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- 基于 Chromium Edge 的 WebView2 不起作用
- 这个工厂类在这个C++视频中的意义何在?
- 使用Python/ c++ /Java流媒体直播视频到网页的最佳方法
- OpenCV Canny Edge直播视频