Как обновить изображение GTK3 с помощью кнопки для захвата изображения с камеры с помощью C ++ - PullRequest
0 голосов
/ 15 февраля 2020

Я разместил это на форуме Pi, но единственный ответ, который я получил, - то, что я отправил это не в том месте.

Размещение на форуме Pi

Мне удалось создать программу, которая будет отображать некоторые кнопки и изображение. Теперь я хотел бы обновить изображение при нажатии кнопки. Как мне это сделать?

Вот что у меня пока есть, все работает, но отсутствует код для обновления отображаемого изображения. 3-секундная задержка перед camrea.grab отсутствует в этом коде, но была добавлена ​​в код, который я использую.

#include <iostream>
#include <raspicam/raspicam.h>
#include <wiringPi.h>
#include <gtk/gtk.h>

#include <fstream>
#include <vector>
#include <unistd.h>

using namespace std;

void Capture_Image(void){
    //camera setup
    raspicam::RaspiCam camera; //Camera object

    if (!camera.open()) 
    {
        cerr << "Could not open the camera" << endl; 
        //return 1;
    }

    camera.grab();

    std::vector<unsigned char> buf;
    buf.resize(camera.getImageTypeSize(raspicam::RASPICAM_FORMAT_RGB));

    camera.retrieve(buf.data(), raspicam::RASPICAM_FORMAT_RGB);

    std::ofstream outFile("/home/pi/s.jpg", std::ios::binary);
    outFile << "P6\n" << camera.getWidth() << " " << camera.getHeight() << " 255\n";
    outFile.write((char*)buf.data(), buf.size());

    cout << "Image saved to output.ppm" << endl;
}

int main(int argc, char **argv)
{
    wiringPiSetup();
    gtk_init (&argc, &argv);

    //Main Box
    GtkWidget *mainBox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
    gtk_container_add (GTK_CONTAINER (win), mainBox);

    //camera image container
    GtkWidget *cameraBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
    gtk_container_add (GTK_CONTAINER (mainBox), cameraBox);

    GtkWidget *cameraView = gtk_image_new_from_file("/home/pi/s.jpg");
    gtk_box_pack_start (GTK_BOX (cameraBox), cameraView, TRUE, TRUE, 0);

    //resize image
    GdkPixbuf *pixBuf = gtk_image_get_pixbuf(GTK_IMAGE(cameraView)); 
    pixBuf = gdk_pixbuf_scale_simple(pixBuf, 300,200,GDK_INTERP_BILINEAR);
    gtk_image_set_from_pixbuf(GTK_IMAGE(cameraView),pixBuf);

    //image capture button
    GtkWidget *imageCapture = gtk_button_new_with_label ("Image Capture");
    g_signal_connect (imageCapture, "clicked", G_CALLBACK (Capture_Image), NULL);
    gtk_box_pack_start (GTK_BOX (cameraBox), imageCapture, TRUE, TRUE, 0);

    //show the new window
    gtk_widget_show_all (win);
    //Start the GTK main loop
    gtk_main ();

    return 0;
}

1 Ответ

0 голосов
/ 19 февраля 2020

Я провел много исследований и нашел решение.

Я обновил свою функцию следующим образом

void Capture_Image(GtkWidget *widget, gpointer image){

И добавил этот код в свою функцию после сохранения изображения.

GtkWidget *cameraView = (GtkWidget *) image;
gtk_image_set_from_file(GTK_IMAGE(cameraView),"/home/pi/s.jpg");
//resize image
GdkPixbuf *pixBufUpdate = gtk_image_get_pixbuf(GTK_IMAGE(cameraView)); 
pixBufUpdate = gdk_pixbuf_scale_simple(pixBufUpdate, 320,240,GDK_INTERP_BILINEAR);
gtk_image_set_from_pixbuf(GTK_IMAGE(cameraView),pixBufUpdate);

Когда я звоню с помощью кнопки, я использовал это

g_signal_connect (imageCapture, "clicked", G_CALLBACK (Capture_Image), cameraView);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...