从(大恒)工业相机读取图片

采用大恒MER系列工业摄像机,不能用opencv自带函数打开摄像头,需要用厂商提供的API
定义控制台应用程序的入口点。

#include "stdafx.h"
#include "core/core.hpp"  
#include   
#include 
#include

#include 
#include 
#include 
#include //for camera
#include 
#include 
#include 

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/ml/ml.hpp"
#include 
#include 
#include 
#include 
using namespace std;
using namespace cv;

//一般的情况是不支持使用命名空间的

int main(int argc, char ** argv)
{
    char filename[1024];
    if (argc == 1)
        sprintf(filename, "%s", "camera1.avi");
    if (argc == 2)
        sprintf(filename, "%s", "123");


    VideoCapture capture;
    capture.open(0);
    if (!capture.isOpened())
    {
        cout << "Could not initialize capturing...\n" << endl;
        return -1;
    }

    //按时间格式命名
    time_t now = time(nullprt);////获取1970.1.1至当前秒数time_t
    struct tm * timeinfo = localtime(&now); //创建TimeDate,并转化为当地时间,
                                            //struct tm * timeinfo = gmtime ( &currTime );   //创建TimeDate,并转化为GM时间,
    char path[60];
    strftime(path, 60, "%Y_%m_%d_%H_%M_%S", timeinfo);
    char strPath[100];
    sprintf(strPath, "%s.avi", path);//将创建文件的命令存入cmdchar中

                                     //保存为avi格式视频
    Mat frame;
    VideoWriter writer;
    writer.open(strPath, CV_FOURCC('X', 'V', 'I', 'D'), 25, Size(640, 480), true);//Size(640, 480)//Size(frame.rows, frame.cols)//"cam.avi"

    int n = 1;
    while (true)
    {
        capture >> frame;
        char* cstr = new char[120];

    //  sprintf(cstr, "%s%d%s", "/home/caros/Documents/../", n++, ".jpg");

        sprintf(cstr, "%s%d%s", "/home/baidu/Doc/shipin_capture", n++, ".jpg");

        imwrite(cstr, frame);

        imshow("Video_Capture", frame);
        if (frame.empty())
        {
            break;
        }
        writer << frame;
        waitKey(3);

    }

    //return 0;
}
#include     
#include     

using namespace cv;    

void main()    
{    
    VideoCapture capture(0);    
   VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));    


    while (capture.isOpened())    
    {    
  Mat frame;    

if ((frame.rows==0)||(frame.cols==0))  
{  
printf("frame capture failed\n");  
system("pause");  
exit(0);  
}  
        capture >> frame;    
        writer << frame;    
        imshow("video", frame);    
        if (cvWaitKey(20) == 27)    
        {    
            break;    
        }    
    }    
} 
void  MainWindow::OnFrameCallbackFun1(GX_FRAME_CALLBACK_PARAM* frame)
{
//    qDebug() << "OnFrameCallbackFun1";
    if (frame->status != 0)
    {
        return;
    }

MainWindow *pf1 = (MainWindow*)(frame->pUserParam);
pf1->m_frame_first = frame;

//QImage image_circle;
uchar *pSrc = nullptr;
int		id = 0;                                //ID号
int		image_width     = 0;           //图像的宽
int                image_height    = 0;          //图像的高
int64_t	        bayer_layout  = 0;              //Bayer格式
void             *result_image = nullptr;      //显示图像指针
QImage       *show_image = nullptr;
QString       device_name = "";              //相机
QString       display_fps = "";                 //显示帧率

image_width    = (int)(pf1->m_struct_camera[id].image_width);
image_height   = (int)(pf1->m_struct_camera[id].image_height);
bayer_layout = pf1->m_struct_camera[id].bayer_layout;
result_image = pf1->m_struct_camera[id].result_image;
show_image = pf1->m_struct_camera[id].show_image;

/******对原始图像进行取校准,去除畸变:求畸变参数*****/
pf1->frame_size[id] = cv::Size(2048, 1536);
std::string params_file = "/home/caros/baidu/adu/valetparking/modules/conf/camera_params.yml";
load_camera_params(params_file, pf1->params[id]);
pf1->mapx[id] = cv::Mat(pf1->frame_size[id], CV_32FC1);
pf1->mapy[id] = cv::Mat(pf1->frame_size[id], CV_32FC1);
cv::Mat R = cv::Mat::eye(3, 3, CV_32F);
initUndistortRectifyMap(pf1->params[id].cameraMatrix, pf1->params[id].distCoeffs, R, pf1->params[id].cameraMatrix,
                        pf1->frame_size[id], CV_32FC1, pf1->mapx[id], pf1->mapy[id]);

//若支持彩色,转换为RGB图像后输出
if (pf1->m_struct_camera[id].color_filter_flag)
{
    //将Raw8图像转换为RGB图像以供显示
    //DxRaw8toRGB24((char*)frame->pImgBuf, result_image, image_width, image_height, RAW2RGB_NEIGHBOUR,
    //    DX_PIXEL_COLOR_FILTER(bayer_layout), false);
    DxRaw8toRGB24((char*)frame->pImgBuf, pf1->m_circle_image[id].data, image_width, image_height,
                  RAW2RGB_NEIGHBOUR, DX_PIXEL_COLOR_FILTER(bayer_layout), false);
    cv::remap(pf1->m_circle_image[id], pf1->m_remap_image[id], pf1->mapx[id], pf1->mapy[id], CV_INTER_LINEAR);
    //         input_images          ,   output_images      ,  the_one_map   ,the_second_map,

    if (calibrate_flag == true)
    {
        for (int i = 0; i < 13; i++)
        {
            cv::circle(pf1->m_remap_image[id],
                       cv::Point(pf1->m_remap_image[id].cols / 2, pf1->m_remap_image[id].rows * i / 12),
                       10, cv::Scalar(255, 255, 0), 3);
        }
        cv::circle(pf1->m_remap_image[id],
                   cv::Point(pf1->m_remap_image[id].cols / 2, pf1->m_remap_image[id].rows / 2),
                   10, cv::Scalar(255, 0, 0), 3);
    }

    if (record_flag[id] == true)
    {
        qDebug() << "camera1 frameindex: " << frame_index[id]++;
        cv::imwrite(writer1, pf1->m_remap_image[id]);
        record_flag[id] = false;
    }
    pSrc = (uchar*)(pf1->m_remap_image[id].data);
    pf1->m_qimage[id] = QImage(pSrc, pf1->m_remap_image[id].cols, pf1->m_remap_image[id].rows,
                             pf1->m_remap_image[id].step, QImage::Format_RGB888);
    pf1->image[id] = &(pf1->m_qimage[id]);
}
else
{
    DxRaw8toRGB24((char*)frame->pImgBuf, result_image, image_width, image_height,RAW2RGB_NEIGHBOUR,
        DX_PIXEL_COLOR_FILTER(NONE),false);
}

device_name.sprintf("相机: %s", pf1->m_baseinfo[id].szDisplayName);
display_fps.sprintf("序列号: %s 显示帧率: %.2f FPS", pf1->m_baseinfo[id].szSN, pf1->m_struct_camera[id].fps);

{
    pf1->m_child_window[id]->ShowImage(pf1->image[id], device_name, display_fps, pf1->m_view_flag);
}

if (pf1->m_display_flag[id] == true)
{
    pf1->m_child_window[id]->setWindowTitle(device_name);
    pf1->m_child_window[id]->update();
    pf1->m_display_flag[id] = false;
}
pf1->UpdateUI();

}


#include "stdafx.h"
#include "camera.h"
#include 
#include 
using namespace cv;
 
 
GX_DEV_HANDLE hDevice = nullptr; 
 static int keycode;
 
MERCamera::MERCamera()
{
	GX_STATUS status = GX_STATUS_SUCCESS;
	int64_t nValue  = nullptr;
	
	GXInitLib();
	status = GXOpenDeviceByIndex(1, &hDevice);
	if(status != GX_STATUS_SUCCESS)
	{
			std::cout<<"open error"<pUserParam);
   if (pFrame->status == nullptr)
   {
        //图像获取成功
		//对图像进行处理...
	   // cout<<"successful"<DrawImage((BYTE*)pFrame->pImgBuf, pFrame->nImgSize);
   }   
   return;    
}
 
 void MERCamera::DrawImage(BYTE *pImageBuf, int nImageSize)
{ 
 
	cv::namedWindow("window",0);
	cv::Mat img(Size(2592,1944),CV_8U,pImageBuf );
	flip(img,img,-1);
	cv::imshow("window",img);
	cv::waitKey(30);
	 
}

参考:
https://blog.csdn.net/pockyym/article/details/13016839

你可能感兴趣的:(计算机视觉-图像,计算机视觉-相机,开发语言-c++,计算机视觉-opencv,QT相关学习)